if
和else
具有共同范围的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
?
答案 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()) {