跟踪与C中的局部变量同名的全局变量

时间:2015-03-23 23:17:17

标签: 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, 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);
}

注意,除了z之外,全局变量与func()中的局部变量具有相同的名称。当我运行程序时。我得到以下输出:

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只是一个局部变量。我知道x = 6来自第3行。

第4行我更失去了轨道。 x的值如何从6跳到9?

如果有人能够引导我完成这个输出,并且可能会给我一个关于范围和阴影的快速解释,那将是很棒的。

2 个答案:

答案 0 :(得分:2)

回答你的第一个问题

  

为什么全局变量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的本地值。

此外,当您更改全局变量时,将记住该程序的生命周期。

答案 1 :(得分:1)

y不是func()内的局部变量。为了使它成为局部变量(会影响全局y变量),您必须在y内声明另一个func()变量,例如:如下例所示。 (此版本将始终打印“y = 1”,并且不会修改全局y变量。)

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);
}

由于y不是原始func()中的局部变量,因此它会增加全局y

请注意,x也是func()的本地,并按值传入。也就是说,来电func(foo)会将foo的值复制到x参数中,而更改x内的func()参数将不< / em>更改foo

第4行来自func(y)来电。它会将x内的{local} func()参数设置为全局变量y的当前值。 y恰好在那时具有值8。 (之前对func()的调用将其从7增加到8.)x = x+1内的作业func()将其转移到9,然后打印出来。