【问题标题】:How do global and static variables work together in C?全局变量和静态变量如何在 C 中协同工作?
【发布时间】:2013-02-03 09:29:24
【问题描述】:

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

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

【问题讨论】:

标签: c static global-variables


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    范围内最近的可见绑定隐藏了所有更远的绑定。所以在main 中,所有的名字都是指局部变量,而在f 中只有a 是局部变量(尽管是静态的,这并不重要),d 指的是函数参数,b 和 @ 987654326@是指全球的。

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2015-06-12
        • 1970-01-01
        • 2015-10-04
        • 2022-01-28
        • 2011-04-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-22
        相关资源
        最近更新 更多