我有这段代码......
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。我只是这样做,因为我正在调试,并注意到我的代码在不应该的时候绘制到屏幕上。
答案 0 :(得分:4)
if (false)
永远不会执行其正文...因为条件的值永远不会为真。因此,在您提供的代码中,drawMap
的其余部分将始终执行,因为它将从不在开始时返回。
考虑if (x == 5)
- 只有在表达式x == 5
为真时才会执行。现在将false
替换为x == 5
...
如果您想要一个始终执行的if
语句,您需要
if (true)
代替。
答案 1 :(得分:1)
让我知道那些实际上没有充分阅读问题的人群,或者如果它如此简单就无法相信OP不理解问题:)
当然,John Skeet的回答是:)
两个想法:
如果您使用的是调试器,则在使用优化进行编译时,行可能出现,无序,完全没有或出现意外行。这是因为某些机器指令会被“归因于”不同的源代码行。无需优化即可编译以消除混淆的来源。它只是令人困惑,因为优化应该(!禁止编译器错误)不改变有效行为
可能是因为你不能相信你会得到一个邪恶的#define。通过仅通过预处理器运行代码来对此进行排除。 g++ -E
会这样做。 MSVC ++可以选择“保留预处理”源
块引用
答案 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) {
}