2

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

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

3 回答 3

1

范围内最近的可见绑定隐藏了所有进一步的绑定。所以在main所有名称中都指的是局部变量,并且f只有局部变量a(尽管是静态的,这是无关紧要的),d指的是函数参数,b并且c指的是全局变量。

您可以使用关键字将更远的名称取消隐藏到有限的扩展extern,但是如果有足够的本地范围,您始终可以创建和隐藏从更深的地方永远无法看到的变量。

于 2013-02-03T09:35:46.887 回答
1

局部变量定义总是“隐藏”同名的全局变量。内部范围总是优先于外部范围。当一个变量“遮蔽”另一个变量时,一些编译器也会产生警告。

于 2013-02-03T09:32:34.447 回答
0

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

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

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

于 2013-02-03T09:41:14.350 回答