为何C++中for语句的体语句与迭代表达式处于不同作用域?
为什么for语句中statement与expression不共享作用域?
根据C++标准中stmt.for章节的定义:
for语句for (init-statement condition; expression) statement等价于
{ init-statement while (condition) { statement expression; } }例外情况:init-statement与condition处于同一作用域;另外statement中(未嵌套在其他迭代语句内)的
continue会在重新计算condition前执行expression。
一、statement与expression作用域不重叠的验证
#include <iostream> int main() { for (; ; std::cout << i) { int i = 0; std::cout << i; break; } return 0; }
Clang编译报错:
main.cpp:4:27: error: use of undeclared identifier 'i' for (; ; std::cout << i) { ^ 1 error generated.
可见statement内定义的i无法被expression访问。
二、init-statement与statement作用域重叠的验证
#include <iostream> int main() { for (int i = 0; ;) { std::cout << i; break; } return 0; }
Clang运行输出:
0
init-statement中定义的i可以被statement正常访问。
三、init-statement与expression作用域重叠的验证
#include <iostream> int main() { for (int i = 0; ; std::cout << i) { break; } return 0; }
Clang运行无报错(无输出是因为循环直接break),说明init-statement定义的i可以被expression访问。
原因解析
从标准给出的等价转换代码就能直接看明白:
expression位于while循环体的外部层级(和statement所在的内部花括号同级),而statement处于while的内部块作用域;- 内部块的变量无法被外部层级的代码访问,因此statement里定义的变量无法被expression获取;
- init-statement处于最外层的块作用域,不管是内部的statement还是外部的expression,都能访问这个外层作用域的变量,所以init-statement和两者都共享作用域。
内容的提问来源于stack exchange,提问作者Géry Ogam
相关产品推荐
相关产品推荐

