【问题标题】:Why does a false statement still execute?为什么错误的语句仍然执行?
【发布时间】:2011-11-05 14:21:06
【问题描述】:

我有这个代码...

void drawMap(void)
{
    if (false)
        return;

    for(auto iter = this->m_layers.begin(); iter != m_layers.end(); ++iter)
    {
        if ((*iter)->get() == NULL)
            continue;
        PN::draw((*iter)->get(), b2Vec2(0,0), true, 0);
    }
}

如果我没记错的话,它永远不应该执行......但它确实......当我改变时

    if (false)
      return;

    if (false)
       return;
    else
       return;

它现在根本不执行,但是第一个语句怎么可能不是假的呢? 服用头痛药

附:我这样做只是因为我在调试时注意到我的代码在不应该的情况下绘制到屏幕上。

【问题讨论】:

  • 你的代码中真的有if (false),或者你认为是if (false)的其他东西?
  • 嗯??? if 语句将始终失败,因此其块内的 return 将永远不会执行。任何体面的编译器都会删除整个东西。
  • 如果问题是你在不应该画的时候画了,那么你的问题是倒退的。您希望return 执行,但它不执行,因为条件为假。
  • 你确定你没有一个#define来改变“假”的意思吗?
  • 这就是为什么我更喜欢几乎总是使用if (...) {...} else {...} 即使是提前返回的分支。这有助于我更好地可视化流程。假设“从不执行”指的是“返回”,因为这个问题似乎有点混乱。

标签: c++ if-statement return execute


【解决方案1】:

我已经看到了这个 if(false) 的用法,在这样的 switch / case 结构中:

int ret = doSomeThingFunction();
if (false) {}
else if (ret < 0 ) {

}
else if (ret == 0) {

}
else if (ret > 0) {

}

【讨论】:

    【解决方案2】:
    if (false)
    

    类似于

    if (1 == 2)
    

    因此永远不会执行下一条语句(或块)。

    在您的上下文中考虑我制作的以下 cmets:

    void drawMap(void)
    {
        if (false) return; //Not gonna happen.
    
        //The following will always happen
        for(auto iter = this->m_layers.begin(); iter != m_layers.end(); ++iter)
        {
            if ((*iter)->get() == NULL)
                continue;
            PN::draw((*iter)->get(), b2Vec2(0,0), true, 0);
        }
    }
    

    【讨论】:

      【解决方案3】:

      把我算在那些实际上没有很好地阅读问题的人群中,或者无法相信 OP 不理解问题,如果它这么简单:)

      John Skeet 的回答当然是正确的 :)

      两个想法:

      1. 如果您在调试器中,使用优化编译时,行可能会显示被执行、乱序、根本不会执行或出现在意外行。这是因为一些机器指令将被“归因”到不同的源代码行。编译不优化,以消除混淆的根源。它只是令人困惑,因为优化应该(!禁止编译器错误)不会改变有效行为

      2. 可能是因为您无法信任的错误 #define for false。通过仅通过预处理器运行代码来排除这种情况。 g++ -E 会这样做。 MSVC++ 可以选择“保留预处理”源代码

      块引用

      【讨论】:

        【解决方案4】:

        if (false)永远执行其主体...因为条件的值永远不会为真。因此,在您给出的代码中,drawMap 的其余部分将始终执行,因为它从不一开始就返回。

        考虑if (x == 5) - 只有当表达式x == 5 为真时才会执行。现在用false 替换x == 5...

        如果你想要一个 总是 执行的 if 语句,你想要

        if (true)
        

        改为。

        【讨论】:

        • Urf.. 我已经输入了这个答案......我只是排除了这种简单情况下布尔逻辑错误的可能性。代码审查是困难完全非技术性的原因:)
        • 呸,我想我脑子放了个屁。我感到愚蠢/困惑。我觉得很愚蠢,因为我知道错误的语句不会执行,但我只是不知何故忘记了,但我也感到困惑,因为我不确定我是否忘记了,或者我的源代码没有被编译并且努力尝试修复它我尝试了我发布的代码并且大脑放屁并且没有意识到我做了什么。可能是因为我已经连续编码了 5 个小时 :X 但是,谢谢。我已经阅读了大约 2000 页的 C++ 书籍...感觉很糟糕
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-16
        • 1970-01-01
        • 2022-01-07
        • 1970-01-01
        • 2015-11-17
        • 2019-04-12
        相关资源
        最近更新 更多