static int z = 42; // I will label this z0
void testMyVar(int x, int y) {
const int z = x/y; // I will label this z1; this z is different than the static z above (z0)
if (z > 10) { // tests z1, not z0
int z = x; // non-const z; I will label this z2, which is different than z1 and z0
z++; // C++ uses inner-most scoped z (so here, it's z2), so this is good (non-const)
for (int i = 0; i < z; i++) {
int z = i / 2; // I will label this z3, it gets re-evaluated every time through the for loop
z = z * z; // all 3 z refererences here is z3
cout << z << endl; // dumps z3
cout << ::z << endl; // dumps z0 note the global scoping operator ::
} // z3 gets "destroyed"
} // z2 gets "destroyed"
} // z1 gets "destroyed
C++语法不提供在不同代码范围指定命名变量范围的机制,仅在全局、类/结构和名称空间。因此,您不能专门使用顶级const int z(我标记为z1的),在代码嵌套级别中定义了更深的z的z2/z3。注意,我可以引用“全局”通过使用全局作用域运算符::在z3级别执行作用域静态z ::z
2条答案
按热度按时间a0x5cqrl1#
声明为
const
的变量一旦初始化就不能修改。在这种情况下,当函数被输入时,
z
被初始化为x/y
,并在函数运行期间保持该值,每次调用函数时,z
都被初始化为x
和y
的值。没有与
static
相关的行为,因为变量未声明为static
。b4lqfgs42#
要意识到z一旦超出作用域就被“销毁”了,因为它不是
static
。如果z在函数作用域中或者在if/for/if中嵌套了3层深,则会出现这种情况C++语法不提供在不同代码范围指定命名变量范围的机制,仅在全局、类/结构和名称空间。因此,您不能专门使用顶级const int z(我标记为z1的),在代码嵌套级别中定义了更深的z的z2/z3。注意,我可以引用“全局”通过使用全局作用域运算符
::
在z3级别执行作用域静态z::z