为什么如果......其他如果......别有共同范围?和其他人一样有什么范围?

时间:2018-03-29 13:46:06

标签: c++ if-statement scope

ifelse具有共同范围的TIL:

if (int x = foo()) {
  // ....
}
else if (int x = bar()) {
  // ...
}
else {
  cout << x; // which x here?
}

我检查了(https://godbolt.org/g/mAvW7B)其他地方的x是第一个。

但为什么呢?对这种非显而易见的行为有什么解释?

在这个例子中:

if (int x1 = foo()) {
  // ....
}
else if (int x2 = bar()) {
  // ...
}
else {
  cout << x2; // why x2 is visible here
}

为什么x2在最后else中可见?为什么第一种情况x来自第一个if

1 个答案:

答案 0 :(得分:4)

根据C ++标准(6.4选择声明)

  

3声明在条件中引入的名称(引入   通过decl-specifier-seq或条件的声明者)在   范围从其声明点到结束   由条件控制的子语句

注意复数中的子语句一词。

这是带有else子句

的if语句定义
if ( condition ) statement else statement

并从C ++标准中注明

  

在第6条中,术语子语句是指包含的语句   或语句出现在语法表示法中。

这些陈述

if (int x = foo()) {
  // ....
}
else if (int x = bar()) {
  // ...
}
else {
  cout << x; // which x here?
}

可以等同地重写

if (int x = foo()) {
  // ....
}
else 
{
    if (int x = bar()) {
      // ...
    }
    else {
      cout << x; // which x here?
    }
}

因此在内部else子句中,变量x表示在内部if语句的条件中声明的变量,该变量是声明为

的变量
if (int x = bar()) {