C++ for循环变量的生命周期很奇怪
C++ for loop variable lifetime is weird
for(int i = 0; i < 3; i++)
{
for(int j = 0; j < 3; j++)
{
int n;
n++;
printf("n : %d\n", n)'
}
}
代码的输出是1 2 3 4 5 6 7 8 9。我想知道为什么在执行变量声明时for循环中的变量n没有被初始化。
您永远不会将 n 初始化为特定值。当您调用 int n
时,C++ 默认不会执行此操作。相反,它只是保留一个整数大小的内存块。因此,当您调用 n++
时,程序只是获取该内存中恰好存在的任何值并递增它。由于您是快速连续地执行此操作而不是在其间创建新变量,因此它恰好一遍又一遍地获取相同的内存。正如@NicolasBuquet 指出的那样,编译器优化也可能与选择相同内存块的一致性有关。
如果您要为 n 赋值(即 int n = 1;
),此行为将会消失,因为特定值将写入分配给 n 的内存块。
在C++中,没有变量被初始化为默认值;如果您发现需要这样做,则必须明确指定一个。
你的代码结果确实是未定义的;您按顺序得到数字 1 到 9 纯属运气。在其他机器或 C++ 实现上,您可能会得到不同的结果。
for(int i = 0; i < 3; i++)
{
for(int j = 0; j < 3; j++)
{
int n;
n++;
printf("n : %d\n", n)'
}
}
代码的输出是1 2 3 4 5 6 7 8 9。我想知道为什么在执行变量声明时for循环中的变量n没有被初始化。
您永远不会将 n 初始化为特定值。当您调用 int n
时,C++ 默认不会执行此操作。相反,它只是保留一个整数大小的内存块。因此,当您调用 n++
时,程序只是获取该内存中恰好存在的任何值并递增它。由于您是快速连续地执行此操作而不是在其间创建新变量,因此它恰好一遍又一遍地获取相同的内存。正如@NicolasBuquet 指出的那样,编译器优化也可能与选择相同内存块的一致性有关。
如果您要为 n 赋值(即 int n = 1;
),此行为将会消失,因为特定值将写入分配给 n 的内存块。
在C++中,没有变量被初始化为默认值;如果您发现需要这样做,则必须明确指定一个。
你的代码结果确实是未定义的;您按顺序得到数字 1 到 9 纯属运气。在其他机器或 C++ 实现上,您可能会得到不同的结果。