C++ 开关在C+中不工作+;
我今天遇到了一个很奇怪的问题。让我们编写以下代码:C++ 开关在C+中不工作+;,c++,unicode,c++11,switch-statement,string-literals,C++,Unicode,C++11,Switch Statement,String Literals,我今天遇到了一个很奇怪的问题。让我们编写以下代码: int llex(){ cout<<"enter 1"<<endl; char32_t c = U'('; cout<<(c==U'#')<<endl; switch(c){ case U'#': cout<<"enter 2"<<endl; return 5; default:
int llex(){
cout<<"enter 1"<<endl;
char32_t c = U'(';
cout<<(c==U'#')<<endl;
switch(c){
case U'#':
cout<<"enter 2"<<endl;
return 5;
default:
break;
}
}
int main( int argc, char** argv)
{
cout<<"enter 1"<<endl;
char32_t c = U'(';
cout<<(c==U'#')<<endl;
switch(c){
case U'#':
cout<<"enter 2"<<endl;
return 5;
default:
break;
}
cout << "------------" << endl;
llex();
}
请注意,main中的代码与llex
函数中的代码相同。为什么它们输出不同的结果?(我正在使用C++11 on clang)。您的llex()
函数应该总是返回一个值,但它没有。如果控制流未命中return
语句,则这是未定义的行为。根据C++11标准第6.6.3/2段:
从函数末尾流出相当于没有值的返回这会导致未定义
值返回函数中的行为
除非你解决了这个问题,否则你不能对你的程序做出任何假设,也不能对它抱有任何期望
例如,我无法重现中的行为。您缺少函数返回语句的结尾和函数中开关的右大括号
int llex(){
cout<<"enter 1"<<endl;
char32_t c = U'(';
cout<<(c==U'#')<<endl;
switch(c){
case U'#':
cout<<"enter 2"<<endl;
return 5;
default:
break;
}
return 0;
}
intllex(){
是否llex
中缺少一个括号。是否确定其他所有内容都正确?行为未定义为llex()
不返回int
。我会从main.com中删除返回5;
,因为UB是awesome@Angew例如,假设案例不会发生,并将其从代码中隐藏。换句话说,编译器知道default
案例不会发生(因为这将导致未定义的行为)编译时使用g++-Wall-std=c++11
获取此行为的警告,并解释可能发生的情况;编译器看到一个控制路径从函数末尾流出,但没有返回,并得出结论,该路径永远不能被采用。在此基础上,它导致e switch语句无条件地选择另一条路径。@bames53:+1,非常有趣
int llex(){
cout<<"enter 1"<<endl;
char32_t c = U'(';
cout<<(c==U'#')<<endl;
switch(c){
case U'#':
cout<<"enter 2"<<endl;
return 5;
default:
break;
}
return 0;
}