2016-09-06 18 views
-2

ほぼ1時間のデバッグの後、最終的に1つのreturn文の後にセミコロンがないことがわかりました。ここに簡略化したバージョン到達不能なコードですが、警告がありません

void PrintNumber(int value) { 
    cout << value << endl; 
} 

void BuggyFunction(int value) 
{ 
    if (value == 0) 
     return 

    PrintNumber(value); 
} 

ええと、PrintNumberは決して呼び出されません。しかしコンパイラ(VS 2015)は静かでした。この行動の理由はありますか?

+2

値がゼロの場合、PrintNumberが呼び出されます。私は視覚スタジオは現在の方法だけを分析すると思う、あなたはこれを把握するために全体的なプログラム分析を必要とするだろう – tobspr

+1

良い論理的なバグ(しかし、有効なコード) –

+3

すべてのif文で大括弧を使うと、 。 –

答えて

4

まあ、技術的にあなたの関数は、(原因セミコロンに)で次のように解釈は:

void BuggyFunction(int value) { 
    if (value == 0) { 
     return PrintNumber(value); 
    } 
} 

PrintNumbervoid戻り値の型などを持っているので、それはしませんが、この文は、完全に構文的に法的です明らかに意味をなさない。

C++コンパイラはインデントを気にしません。ステートメントと変数のスコープを正しく設定したい場合は、混乱を避けるために中括弧を使用してください(前述のように)。

+1

また、初期の返り値を避ける:' if(value!= 0){PrintNumber(value);}は、この単純なケースでより良い意図を表現するでしょう –

+3

GCC 6は実際に '-Wmisleading-indentation'警告を持っています:) –

2

あなたのコードは同等です:PrintNumberの戻り値の型がvoidであるので

void BuggyFunction(int value) 
{ 
    if (value == 0) 
    { 
     return PrintNumber(value); 
    } 
} 

、これは不審な暗黙の型変換に関連する任意のコンパイラ警告を生成しません。

コンパイラが「到達不能なコード」という警告を生成した場合、あなたが書いたコードはすべて到達可能であるため、間違います。

関連する問題