"if"没有花括号的块会使后续的"else if"嵌套

iam*_*ind 21 c c++ if-statement nested-if

AFAIK,如果没有提供"if"块,那么花括号内部只会考虑1个语句.例如

if(..)
  statement_1;
  statement_2;
Run Code Online (Sandbox Code Playgroud)

无论选项卡如何,仅statement_1if块内部考虑.

以下代码与此不相符:

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.

  • @AProgrammer我不知道任何其他语言,我只想掩饰我的屁股.我确信至少有一些*实验性语言可以区别对待它们. (3认同)
  • 那是我在一段时间内见过的最快的+10! (2认同)

Ben*_*enW 6

因为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)

您可以通过明确地将大括号放在您想要的位置来解决问题.