【发布时间】:2015-03-23 23:17:17
【问题描述】:
当存在同名的局部变量时,我在跟踪全局变量的值时遇到了一些问题。
这是我正在使用的代码:
#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);
}
注意全局变量与 func() 中的局部变量同名,除了 z。当我运行程序时。我得到以下输出:
main: x= 6, y= 7, z= 5
func: x= 7, y= 8, z=10
main: x= 6, y= 8, z= 5
func: x= 9, y= 9, z=10
main: x= 6, y= 9, z= 5
func: x= 6, y=10, z=10
main: x= 6, y=10, z= 5
我能理解第一行的出处。这只是全局变量的值,但 main 使用的是 5 而不是 10,因为全局变量会隐藏局部变量。我也可以理解第 2 行。将全局变量 x 传递给 func,给出 7。也使用全局变量 y,给出 8。
第 3 行是我忘记价值观的地方。为什么全局变量 y 的值一直保持为 8? func() 函数调用是否永久更改了它的值?我认为这是不可能的,因为 func() 中的 y 只是一个局部变量。我明白第 3 行中 x = 6 的来源。
第 4 行我更加迷失了方向。 x的值怎么能从6跳到9?
如果有人能指导我完成这个输出,那将是非常棒的,也许能给我一个关于范围和阴影的快速解释。
【问题讨论】:
-
您永远不会在
func中声明y,因此没有任何内容被隐藏。func(x)inmain也不会影响全局x。 -
如果你真的想不明白,在
main()中声明int z = 5;之前添加printf("main: x=%2d, y=%2d, z=%2d\n", x, y, z);(假设C99 或更高版本支持),并添加:{ int z = 20; printf("main: x=%2d, y=%2d, z=%2d\n", x, y, z); },在其中之一之后其他printf()电话。
标签: c scope global-variables