切换不能在C ++中工作

时间:2013-04-26 13:26:29

标签: c++ unicode c++11 switch-statement string-literals

今天我遇到了一个非常奇怪的问题。让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。)

2 个答案:

答案 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;
}