跟踪与C中的局部变量同名的全局变量
当存在同名的局部变量时,我在跟踪全局变量的值时遇到了一些问题 这是我正在使用的代码:跟踪与C中的局部变量同名的全局变量,c,scope,global-variables,C,Scope,Global Variables,当存在同名的局部变量时,我在跟踪全局变量的值时遇到了一些问题 这是我正在使用的代码: #include <stdio.h> void func(int); int x=6, y=7, z=10; int main(int argc, char **argv) { int z=5; printf("main: x=%2d, y=%2d, z=%2d\n", x, y, z); func(x); printf("main: x=%2d, y=%2d,
#include <stdio.h>
void func(int);
int x=6, y=7, z=10;
int
main(int argc, char **argv) {
int z=5;
printf("main: x=%2d, y=%2d, z=%2d\n", x, y, z);
func(x);
printf("main: x=%2d, y=%2d, z=%2d\n", x, y, z);
func(y);
printf("main: x=%2d, y=%2d, z=%2d\n", x, y, z);
func(z);
printf("main: x=%2d, y=%2d, z=%2d\n", x, y, z);
return 0;
}
void
func(int x) {
x = x+1;
y = y+1;
printf("func: x=%2d, y=%2d, z=%2d\n", x, y, z);
}
我能理解第一行是从哪里来的。这只是全局变量的值,但main使用5而不是10,因为全局变量会遮挡局部变量。我也能理解第二行。全局变量x被传递到func中,得到一个7。还使用了全局变量y,给出了8
第3行是我失去价值观的地方。为什么全局变量y的值保持为8?func()函数调用是否永久更改了其值?我认为这是不可能的,因为func()中的y只是一个局部变量。但是我知道x=6来自第3行
第四行我更迷路了。x的值如何从6跳到9
如果有人能带我看一下这个输出,也许能给我一个关于范围和阴影的快速解释,那就太好了。
y
不是func()中的局部变量。
。为了使其成为局部变量(这将隐藏全局y
变量),您必须在func()
中声明另一个y
变量,例如,如下例所示。(此版本将始终打印“y=1”,并且不会修改全局y
变量。)
由于y
不是原始func()
中的局部变量,因此它将递增全局y
请注意,x
也是func()
的本地对象,并通过值传入。也就是说,调用func(foo)
会将foo
的值复制到x
参数中,并且在func()
中更改x
参数不会更改foo
第4行来自
func(y)
调用。它将func()
内的(本地)x
参数设置为全局变量y
的当前值y
恰好在该点上有值8。(上一次调用func()
将其从7增加到8)func()
内部的赋值x=x+1
将其增加到9,然后打印出来。回答第一个问题
为什么全局变量y的值保持为8?func()函数调用是否永久更改了其值
是的,它确实永久性地更改了全局变量y
,因为它是全局变量,而不是局部变量(如果声明为int y;
,它将是局部变量)
x的值如何从6跳到9
将全局变量y
(在第一次函数调用中更改为8)传递给函数。此值作为x
本地存储在函数中。所以x+1将变成9
这就是全局变量的危险。一旦将局部变量命名为相同的名称,您将无法了解什么值包含什么值
下面是一个小例子,解释一些细节:
int x = 3;
int main(){
int x = 8;
printf("%d", x);
}
这将打印8
,因为代码将获取x
的本地值
此外,当您更改一个全局变量时,它将在程序的整个生命周期内被记住。您从未在
func
中声明y
,因此不会隐藏任何内容func(x)
inmain
中的func(x)
也不会对全局x
进行阴影处理。如果您真的想让您大吃一惊,请添加printf(“main:x=%2d,y=%2d,z=%2d\n”,x,y,z)代码>在声明intz=5之前在main()
(假设C99或更高版本支持),并在另一个printf()调用之后添加:{int z=20;printf(“main:x=%2d,y=%2d,z=%2d\n”,x,y,z);}
。
void
func(int x) {
int y = 0;
x = x+1;
y = y+1;
printf("func: x=%2d, y=%2d, z=%2d\n", x, y, z);
}
int x = 3;
int main(){
int x = 8;
printf("%d", x);
}