全局变量和静态变量如何在C中一起工作?

时间:2013-02-03 09:29:24

标签: c static global-variables

我必须确定该程序的输出(不在计算机上运行它)。我非常不确定全局变量和静态变量如何协同工作。

#include <stdio.h>

void f(int d);

int a = 1, b = 2, c = 3, d = 4;

int main()
{
    int a = 5, c = 6;
    f(a);
    f(b);
    f(c);
    printf("%d %d %d %d\n",a,b,c,d);
    return 0;
}

void f(int d)
{
    static int a = 0;
    a = a + 7;
    b = a + d;
    c++;
    d--;
    printf("%d %d %d %d\n",a,b,c,d);
}

3 个答案:

答案 0 :(得分:1)

局部变量定义总是“隐藏”具有相同名称的全局变量。内部范围始终优先于外部范围。当变量“遮蔽”另一个变量时,某些编译器也会发出警告。

答案 1 :(得分:1)

范围内最近的可见绑定隐藏了所有其他绑定。所以在main中,所有名称都引用局部变量,而f只有a是本地变量(尽管是静态的,这是无关紧要的),d指的是函数参数,bc指的是全局参数。

您可以使用extern关键字取消隐藏更远的名称,但是如果有足够的本地范围,您可以随时创建和隐藏您无法从更深处看到的变量。

答案 2 :(得分:0)

如果使用相同的标识符声明两个变量,则访问引用范围最小的变量。

  
    

C11(n1570),§6.2.1标识符范围

         

如果标识符指定同名的两个不同实体     空间,范围可能重叠。如果是这样,一个实体(内部范围)的范围将结束     严格地在另一个实体的范围之前(外部范围)。在内部范围内,     identifier指定在内部作用域中声明的实体;在外部宣布的实体     范围在内部范围内隐藏(并且不可见)。