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