4

C4702: unreachable code warning in a for loop; が表示されます。奇妙なことは、括弧内のコンポーネントを分解することにより、警告がインクリメント部分を指していることです。このエラーを示すサンプル プログラムを次に示します。

int main()
{
    int foo = 3;
    for (int i = 0;
        i < 999;
        i++)    // warning on this line
    {
        if (foo == 4);
        {
            break;
        }
    }
    return 0;
}

for ループは非常に単純に見えるため、この行の何が問題なのかわかりません。

4

3 に答える 3

12

if 文にセミコロンがあります。

if (foo == 4);

for ループには次の構造があることを思い出してください。

for (initialisation; condition; increment/decrement)
    statement

実行は次の順序で進行します。

  1. initialisation
  2. condition; false の場合は終了
  3. statement
  4. increment/decrement
  5. 手順 2 に進みます

コンパイラが に到達できないことを警告している場合、increment/decrementそれより前の何かが実行を常にスキップさせていることを意味します。この場合、浮遊セミコロンが原因でbreakが常に実行され、途中でループから飛び出します。

于 2015-01-15T08:30:32.860 に答える
4
for (int i = 0;
    i < 999;
    i++)    // warning on this line
{
    if (foo == 4);
    {
        break;
    }
}

これは

for (int i = 0;
    i < 999;
    )    
{
    if (foo == 4);
    {
        break;
    }
    i++;  /* Note the increment here */
}

とにかくあなたが行くbreakのは、if(foo == 4);だからi++到達できないからです

于 2015-01-15T08:35:25.190 に答える
1

問題(つまり、意図しない;)は、すでに2つの回答で説明されています。

コンパイラ オプションの設定を確認する必要があることを付け加えたいと思います。多くのコンパイラは、このような「奇妙に見える」コードを検出して、警告を出すことができます。例えば:

警告: 「'if' ステートメントの本文が空です」

さらに、すべての警告をエラーとして処理するようにコンパイラを構成できます。

言い換えれば、コンパイラ オプションは、多くの場合、「意図しないコード」を見つけて、時間を無駄にしないようにするのに役立ちます。

ところで - Eclipse エディターは、そのような if ステートメントを入力するとすぐに「疑わしいセミコロン」の警告を出すことさえあります。

于 2015-01-15T09:12:45.140 に答える