我必须确定该程序的输出(不在计算机上运行它)。我非常不确定全局变量和静态变量如何协同工作。
#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);
}
答案 0 :(得分:1)
局部变量定义总是“隐藏”具有相同名称的全局变量。内部范围始终优先于外部范围。当变量“遮蔽”另一个变量时,某些编译器也会发出警告。
答案 1 :(得分:1)
范围内最近的可见绑定隐藏了所有其他绑定。所以在main
中,所有名称都引用局部变量,而f
只有a
是本地变量(尽管是静态的,这是无关紧要的),d
指的是函数参数,b
和c
指的是全局参数。
您可以使用extern
关键字取消隐藏更远的名称,但是如果有足够的本地范围,您可以随时创建和隐藏您无法从更深处看到的变量。
答案 2 :(得分:0)
如果使用相同的标识符声明两个变量,则访问引用范围最小的变量。
C11(n1570),§6.2.1标识符范围
如果标识符指定同名的两个不同实体 空间,范围可能重叠。如果是这样,一个实体(内部范围)的范围将结束 严格地在另一个实体的范围之前(外部范围)。在内部范围内, identifier指定在内部作用域中声明的实体;在外部宣布的实体 范围在内部范围内隐藏(并且不可见)。