iam*_*ind 21 c c++ if-statement nested-if
AFAIK,如果没有提供"if"块,那么花括号内部只会考虑1个语句.例如
if(..)
statement_1;
statement_2;
Run Code Online (Sandbox Code Playgroud)
无论选项卡如何,仅statement_1在if块内部考虑.
以下代码与此不相符:
int main ()
{
if(false) // outer - if
if(false) // nested - if
cout << "false false\n";
else if(true)
cout << "true\n";
}
Run Code Online (Sandbox Code Playgroud)
上面的代码不打印任何东西.它应该打印出来"true".
它出现时else if自动嵌套在外部 if块中.g++ -Wall发出警告,但这不是问题.一旦你把花括号,一切都按预期的顺利.
Kon*_*lph 52
行为实际上并没有不同,它完全一致:整个内部if块 - 包括else if- 被认为是一个块.
这是解析中的经典歧义,称为"悬空else问题":当在普通BNF中写下语法时,有两种有效的解析方法:
尾部else是外部块的一部分,或者是内部块的一部分.
大多数语言通过(任意)决定解析器贪婪地匹配块来解决模糊性 - 即将else[ if]分配给最接近的if.
因为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";
}
}
}
Run Code Online (Sandbox Code Playgroud)
您可以通过明确地将大括号放在您想要的位置来解决问题.