for循环增量中无法访问的代码?

Unreachable code in for loop increment?

我收到 C4702:for 循环中无法访问的代码警告;奇怪的是 - 通过分解括号内的组件 - 警告指向增量部分。下面是演示此错误的示例程序:

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

我不知道这行有什么问题,因为 for 循环看起来很简单。

您的 if 语句中有一个分号:

if (foo == 4);

回想一下 for 循环具有以下结构:

for (initialisation; condition; increment/decrement)
    statement

执行将按以下顺序进行:

  1. initialisation
  2. condition;如果为假则结束
  3. statement
  4. increment/decrement
  5. 转到第 2 步

如果编译器警告 increment/decrement 无法访问,这意味着它之前的某些东西导致执行总是跳过它 - 在这种情况下,杂散的分号导致 break 总是执行,过早跳出循环。

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++ 无法到达

问题(即意外的 ;)已在两个答案中描述。

我想补充一点,你应该看看你的编译器选项设置。许多编译器可以检测到这样的 "strange looking" 代码并给你一个警告。例如:

警告:"empty body in an 'if' statement"

此外,可以将编译器配置为将所有警告视为错误。

换句话说 - 编译器选项通常可以帮助您找到 "unintended code" 从而避免浪费时间。

顺便说一句 - Eclipse 编辑器甚至可以在您键入这样的 if 语句时立即发出 "suspicious semicolon" 警告。