条件中声明的变量的作用域
Scope of variable declared in condition
一些重构导致了一段代码,这段代码将我引向了这个最小的测试用例:
int main () {
if (int i=1) {
/* IF-BLOCK */
} else {
throw i;
}
}
这汇编得很好。然而,我一直认为i
只对IF-BLOCK
可见,但似乎不是。这是编译器错误吗?
此外,为什么以下内容有效?
int main () {
if (int i=1) {
} else if (int i=2) {
} else {
throw i;
}
}
注意第二个if
"重新声明"i
。另一个编译器错误?
6.4选择语句[stmt.select]
由条件中的声明引入的名称(由
type-specifier-seq
或条件的声明符引入)从其声明点到受控子语句结束都在作用域内由条件决定如果在由条件下,重新声明名称的声明格式错误[示例:if (int x = f()) { int x; // ill-formed, redeclaration of x } else { int x; // ill-formed, redeclaration of x }
--结束示例]
(强调矿)
这基本上意味着i
的范围从条件开始,在if
-块之后结束,其中else
-块也是if
-块的一部分。
嵌套if
的第二个问题是基于(错误的)假设,即else-if
是介绍性if
的一部分,但事实并非如此。if (int i=2)
是第一个else
的主体!
if (int i=1)
|
/
/
/
/
/
if-block else
|
if(int i=2)
/
/
/
if-block throw i
这反过来意味着什么:
int main () {
if (int i=1) {
} else if (1) {
throw (i+2);
} else {
throw i;
}
}
此代码是有效的,因为i
声明在throw (i+2);
中可见,但隐藏第一个i
仍然有效,因为在嵌套作用域中,名称可以被覆盖:
int main () {
if (int i=1) {
} else if (int i=2) {
throw (i+2); // now refers to `int i=2`
} else {
throw i;
}
}
总之,不要恐慌:使用上一条语句中的模式编写标记器或解析器或其他东西仍然有效,这里的相关新知识是,条件中的任何声明都跨越整个if
树,但可以在任何嵌套的if
中被覆盖。
此外,请确保以下内容仍然无效(即使在旧的编译器中有效):
if (int i=0) {}
std::cout << i; // nope, not valid
相关文章:
- 在类函数中初始化外部作用域变量
- 不同作用域中的静态变量和全局变量
- 未在此作用域中声明的函数和变量 (C++)
- 如何在C++中访问作用域的变量输出?
- 不同块作用域中的 C++ 变量具有相同的地址
- C++If语句变量作用域
- 派生类变量作用域 c++
- 如何理解C++变量作用域规则
- C/C++编译器关于变量作用域的优化
- 应用程序有2个静态变量作用域
- 堆变量作用域
- c++中变量作用域的机制
- c++变量作用域的类友
- 函数所需的总堆栈大小如何与变量作用域相关
- 声明友元函数时出现变量作用域错误
- 引用的C++变量作用域
- c++中的变量作用域
- c/c++中局部变量作用域和生命周期的混淆
- c++中的局部/静态变量作用域
- 多个c++文件和变量作用域