跟踪与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)
in
main
中的
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);
}