AFAIK,如果没有提供" if“块的花括号,则只考虑其中的一条语句。例如:
if(..)
statement_1;
statement_2;
与制表符无关,在if
块中只考虑statement_1
。
下面的代码并不符合这个要求:
int main ()
{
if(false) // outer - if
if(false) // nested - if
cout << "false false\n";
else if(true)
cout << "true\n";
}
上面的代码没有打印任何东西。它应该已经打印了"true"
。
它看起来像是自动嵌套在外部if
块中的else if
。g++ -Wall
发出警告,但这不是这里的问题。一旦你放上了花括号,一切都会像预期的那样顺利。
为什么会有如此不同的行为?
[GCC演示:without braces和with braces]。
发布于 2012-07-31 14:51:14
行为实际上并不是不同的,它是完全一致的:整个内部if
块-包括被视为一个块的else if
- is。
这是语法分析中的经典歧义,称为“dangling-else
problem”:有两种有效的方法来解析它,当语法写在常规的BNF中时:
尾随else
要么是外部块的一部分,要么是内部块的一部分。
大多数语言通过(任意)决定解析器贪婪地匹配块来解决多义性-即将else
if
分配给最接近的if
。
发布于 2012-07-31 14:52:18
因为else
实际上是与内部if
组合在一起的,而不是外部的。它实际上被解析为
int main ()
{
if(false) // outer - if (never gets executed)
{
if(false) // nested - if
{
cout << "false false\n";
} else if(true) {
cout << "true\n";
}
}
}
您可以通过显式地将大括号放在您想要的位置来解决这个问题。
发布于 2012-07-31 14:51:30
它不应该打印任何东西。它等同于此,因为第二个if/else if是属于第一个if的一个块:
if(false) {
if(false) // nested - if
cout << "false false\n";
else if(true)
cout << "true\n";
}
https://stackoverflow.com/questions/11734604
复制相似问题