我得到的答案我= 2 但我的问题是发生了什么事我= 0 ??? 按照我的理解 I = 0将在数据段 I = 2会在堆栈段相同的变量作为全局和局部用C
#include <stdio.h>
int i = 0;
void main()
{
int i = 2;
printf("i value is %d\n",i);`
}
我得到的答案我= 2 但我的问题是发生了什么事我= 0 ??? 按照我的理解 I = 0将在数据段 I = 2会在堆栈段相同的变量作为全局和局部用C
#include <stdio.h>
int i = 0;
void main()
{
int i = 2;
printf("i value is %d\n",i);`
}
局部变量i
隐藏全局变量i
。因此,当你打印它时,它会打印局部变量。
如果你想修改全局变量,你可以使用这个想法在这里提到:
您已声明具有相同名称为全局变量一个局部变量,通过使i
(隐藏它当在声明了局部变量的同一范围内使用时)请参考本地变量而不是全局变量。
最自然和合乎逻辑的解决方案是:避免在可能的情况下始终进行。
Shadowing。您的全局变量i = 0
受当地i = 2
的影响。
不要这样做,避免名称冲突。
顺便说一句,void main() {}
不是标准C(假设你的程序是在托管环境中运行,即在一个操作系统之上)。改为使用int main(void) { return 0; }
。 Reference.Another one.
实际上'int main()'也不是标准C语言。如果你不关心参数,你应该使用'int main(void)'。 – user694733
@ user694733你说得对,谢谢。改进了我的帖子。 –
它是变量的作用域在这里工作了。如果声明了多个相同类型的变量,那么可以访问最接近范围的操作符。
范围解析将在编译时发生。当编译器在代码中访问时搜索任何变量声明时,它将首先查找最近的作用域,然后上升。全局变量将被最后访问。
'i == 2;' ':: i == 0;' – MFH
你藏起来了。您通过对另一个变量使用相同的标识符来隐藏“i”。你为什么这么做? –
除了你的问题,你不应该使用'void main()'签名。改用'int main()'。 – Shaac