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 のコードはllexfunction のコードと同一であることに注意してください。なぜ彼らは異なる結果を出力するのですか? (clang で C++11 を使用しています)。

4

2 に答える 2

11

あなたのllex()関数は常に値を返すはずですが、そうではありません。制御フローがステートメントにヒットしない場合、これは未定義の動作です。returnC++11 標準のパラグラフ 6.6.3/2 によると:

関数の最後を流れることは、値を持たない戻りと同じです。これにより、値を返す関数で未定義の動作が発生します

これを修正しない限り、プログラムについて仮定を立てることも期待することもできません。

たとえば、この修正された live exampleの動作を再現できません。

于 2013-04-26T13:29:23.287 に答える
1

関数内のスイッチの関数終了 return ステートメントと閉じ中かっこがありません。

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 に答える