切换不能在C++中工作

Woj*_*ilo 3 c++ unicode string-literals switch-statement c++11

我今天遇到了一个非常奇怪的问题.让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();
}
Run Code Online (Sandbox Code Playgroud)

输出是:

enter 1
0
------------
enter 1
0
enter 2
Run Code Online (Sandbox Code Playgroud)

请注意,main中的代码对于llex函数中的代码是IDENTICAL .他们为什么输出不同的结果 (我在clang上使用C++ 11).

And*_*owl 11

你的llex()函数应该总是返回一个值,但它不会.如果控制流未达到语句,则这是未定义的行为return.根据C++ 11标准的6.6.3/2段:

流出函数末尾相当于没有值的返回; 这会导致值返回函数中的未定义行为.

除非你解决这个问题,否则你不能对你的程序做任何假设,也不能对它有所期望.

例如,我无法重现此固定实例中的行为.

  • 并解释可能发生的事情; 编译器看到一个从函数末尾流出而没有返回的控制路径,并断定该路径永远不会被占用.在此基础上,它使switch语句无条件地采用其他路径. (3认同)