iam*_*ind 21 c c++ if-statement nested-if
AFAIK,如果没有提供"if"块,那么花括号内部只会考虑1个语句.例如
if(..)
  statement_1;
  statement_2;
无论选项卡如何,仅statement_1在if块内部考虑.
以下代码与此不相符:
int main ()
{
  if(false)  // outer - if
    if(false)  // nested - if
      cout << "false false\n";
  else if(true)
    cout << "true\n";
}
上面的代码不打印任何东西.它应该打印出来"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";
    }
  }
}
您可以通过明确地将大括号放在您想要的位置来解决问题.