【问题标题】:Unreachable code in for loop increment?for循环增量中的代码无法访问?
【发布时间】:2015-01-15 08:30:32
【问题描述】:

我收到 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 循环看起来很简单。

【问题讨论】:

    标签: c++ c visual-studio unreachable-code


    【解决方案1】:

    您的 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(auto variable: collection) { return variable->something(); }”的形式。这个假循环应该在我的集合中找到第一个“变量”并返回它的工作。由于返回总是跳过隐藏的增量,这会产生“代码未达到”警告。在返回之前添加一个简单的“if(变量)”就可以了。 (假设集合例如是一个向量。)
    • @FrancisPierot:更简洁的解决方法是改用if (!collection.empty()) return collection.front().something();,那么很明显您需要条件而不是循环。
    • @thakis 确实,更干净是的!我想避免使用任何“收藏”。参考使用智能 for() 来清理代码,但最终它使事情变得更加模糊。
    【解决方案2】:
    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++ 是不可访问的

    【讨论】:

      【解决方案3】:

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

      我想补充一点,您应该查看一下您的编译器选项设置。许多编译器可以检测到这种“看起来很奇怪”的代码并给你一个警告。例如:

      警告:“'if' 语句中的空正文”

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

      换句话说 - 编译器选项通常可以帮助您找到“意外代码”,从而避免浪费时间。

      顺便说一句 - Eclipse 编辑器甚至可以在您键入这样的 if 语句时立即给出“可疑分号”警告。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-02-06
        • 2014-01-22
        • 2018-02-23
        • 1970-01-01
        • 2020-10-11
        • 2019-11-30
        • 1970-01-01
        相关资源
        最近更新 更多