首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >不带大括号的"if“块使后续的"else if”嵌套

不带大括号的"if“块使后续的"else if”嵌套
EN

Stack Overflow用户
提问于 2012-07-31 14:48:35
回答 5查看 31.1K关注 0票数 22

AFAIK,如果没有提供" if“块的花括号,则只考虑其中的一条语句。例如:

代码语言:javascript
复制
if(..)
  statement_1;
  statement_2;

与制表符无关,在if块中只考虑statement_1

下面的代码并不符合这个要求:

代码语言:javascript
复制
int main ()
{
  if(false)  // outer - if
    if(false)  // nested - if
      cout << "false false\n";
  else if(true)
    cout << "true\n";
}

上面的代码没有打印任何东西。它应该已经打印了"true"

它看起来像是自动嵌套在外部if块中的else ifg++ -Wall发出警告,但这不是这里的问题。一旦你放上了花括号,一切都会像预期的那样顺利。

为什么会有如此不同的行为?

[GCC演示:without braceswith braces]。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-07-31 14:51:14

行为实际上并不是不同的,它是完全一致的:整个内部if块-包括被视为一个块的else if - is。

这是语法分析中的经典歧义,称为“dangling-else problem”:有两种有效的方法来解析它,当语法写在常规的BNF中时:

尾随else要么是外部块的一部分,要么是内部块的一部分。

大多数语言通过(任意)决定解析器贪婪地匹配块来解决多义性-即将else if分配给最接近的if

票数 58
EN

Stack Overflow用户

发布于 2012-07-31 14:52:18

因为else实际上是与内部if组合在一起的,而不是外部的。它实际上被解析为

代码语言:javascript
复制
int main ()
{
  if(false)  // outer - if (never gets executed)
  { 
    if(false)  // nested - if
    {
        cout << "false false\n";
    } else if(true) {
        cout << "true\n";
    }
  }
}

您可以通过显式地将大括号放在您想要的位置来解决这个问题。

票数 6
EN

Stack Overflow用户

发布于 2012-07-31 14:51:30

它不应该打印任何东西。它等同于此,因为第二个if/else if是属于第一个if的一个块:

代码语言:javascript
复制
  if(false) {
    if(false)  // nested - if
      cout << "false false\n";
    else if(true)
      cout << "true\n";
  } 
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11734604

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档