3

我今天遇到了一个非常奇怪的问题。让我们考虑以下代码:

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)。

4

2 回答 2

11

您的llex()函数应该始终返回一个值,但事实并非如此。如果控制流未命中语句,则这是未定义的行为。return根据 C++11 标准的第 6.6.3/2 段:

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

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

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

于 2013-04-26T13:29:23.287 回答
1

您在函数中缺少用于 switch 的函数结束返回语句和右花括号。

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;
}
于 2013-04-26T13:32:09.640 回答