今天我遇到了一个非常奇怪的问题。让concider得到以下代码:
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();
}
输出是:
enter 1
0
------------
enter 1
0
enter 2
请注意,main中的代码对于llex
函数中的代码是IDENTICAL。他们为什么输出不同的结果(我在clang上使用C ++ 11。)
答案 0 :(得分:11)
你的llex()
函数应该总是返回一个值,但它不会。如果控制流未达到return
语句,则这是未定义的行为。根据C ++ 11标准的第6.6.3 / 2段:
离开函数末尾相当于没有值的返回; 这导致未定义 价值回归函数中的行为。
除非你解决这个问题,否则你不能对你的程序做出任何假设,也不能对它有所期望。
例如,我无法重现this fixed live example中的行为。
答案 1 :(得分: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;
}