为什么假句仍然执行?

时间:2011-08-28 19:08:21

标签: c++ if-statement return execute

我有这段代码......

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;

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

P.S。我只是这样做,因为我正在调试,并注意到我的代码在不应该的时候绘制到屏幕上。

4 个答案:

答案 0 :(得分:4)

if (false) 永远不会执行其正文...因为条件的值永远不会为真。因此,在您提供的代码中,drawMap的其余部分将始终执行,因为它将从不在开始时返回。

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

如果您想要一个始终执行的if语句,您需要

if (true)

代替。

答案 1 :(得分:1)

让我知道那些实际上没有充分阅读问题的人群,或者如果它如此简单就无法相信OP不理解问题:)

当然,John Skeet的回答是:)

两个想法:

  1. 如果您使用的是调试器,则在使用优化进行编译时,行可能出现,无序,完全没有或出现意外行。这是因为某些机器指令会被“归因于”不同的源代码行。无需优化即可编译以消除混淆的来源。它只是令人困惑,因为优化应该(!禁止编译器错误)不改变有效行为

  2. 可能是因为你不能相信你会得到一个邪恶的#define。通过仅通过预处理器运行代码来对此进行排除。 g++ -E会这样做。 MSVC ++可以选择“保留预处理”源

  3.   

    块引用

答案 2 :(得分:0)

if (false)

类似于

if (1 == 2)

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

在您的上下文中,请考虑以下评论:

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 :(得分:0)

我已经看到了这个if(false)的用法,在像这样的结构的开关/情况中:

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

}
else if (ret == 0) {

}
else if (ret > 0) {

}