代码如下:
#include <stdio.h>
int main()
{
int i;
printf("%p\n",&i);
for (i = 0; i < 5; i++)
{
int i = 10;
printf("%d %p\n", i,&i);
i++;
}
return 0;
}
首先我们定义了一个变量i
(就在主要之后)。然后在 for
的开头循环我们定义了相同的变量i
再次。所以,里面 for
循环,i
的值是 10。 for
循环必须只迭代一次,因为 i>5
第一次迭代后。但令我惊讶的是输出如下:
0x7ffe8b799da0
10 0x7ffe8b799da4
10 0x7ffe8b799da4
10 0x7ffe8b799da4
10 0x7ffe8b799da4
10 0x7ffe8b799da4
我的问题是:
1)为什么编译器考虑初始定义的变量i
在执行 i<5;i++
时指令,而不是重新定义的变量 i
? (第一次迭代后)。
2) 为什么编译器将不同的内存地址分配给相同的变量标识符 i
?
最佳答案
Why is the compiler considering the initial defined variable i while executing i<5;i++ instruction and, not the re-defined variable i? (after first iteration).
因为重新定义的(阴影)变量还不在范围内。如果删除第一个定义,则会出现“标识符未声明”错误。这在循环的第一次迭代后也不会改变,因为它是在编译时确定的。
2) Why did compiler assign different memory address to same variable identifier i?
即使您无法访问外部 int i
在循环内部,作为第二个阴影,它仍然存在,因此需要自己的内存。它没有被另一个覆盖 int i
.您可以通过放置 printf("%d\n", i);
来查看循环后 - 它将打印 5
,因为那是 i
的值(value)循环后。
另一方面,i++;
在循环结束时没有效果,因为它影响了 i
在循环内,在 i++;
之后超出范围.这不同于 i++;
在for (i = 0; i < 5; i++)
,这增加了外部i
.
关于c - 为什么编译器在重新定义变量后会为同一个变量分配不同的内存地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58298020/