【发布时间】:2013-04-26 13:26:28
【问题描述】:
我今天遇到了一个很奇怪的问题。让我们考虑以下代码:
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 函数中的代码相同。为什么他们输出不同的结果? (我在 clang 上使用 C++11)。
【问题讨论】:
-
llex中缺少一个括号。你确定其他一切都正确吗? -
行为未定义,因为
llex()不返回int。 -
我会从 main 中删除
return 5;。 -
因为UB太棒了
-
@Angew 比如,假设这种情况不会发生,并从代码中抑制它。换句话说,编译器知道
default情况不会发生(因为这会导致未定义的行为),并且由于只有另一种情况,所以生成它。
标签: c++ unicode c++11 switch-statement string-literals