使用全局变量解释C程序的输出

问题描述:

void f(void); 
int x = 15213; 
int main() 
{ 
    f(); 
    printf("x = %d\n", x); 
    return 0; 
} 

/* bar3.c */ 
int x; 
void f() 
{ 
    x = 15212; 
} 

在上面的代码中,我得到的输出是15212.我不明白怎么做?使用全局变量解释C程序的输出

首先,主函数调用f()在另一个c文件中定义。在f()中,x的值从15213更改为15212.然后我们打印x。但是对x做出的改变应该只保留在f中吗? X的范围应该仅限于f()。即使那么它正在打印15212

+4

'x'是一个全局变量。为什么它的范围限于'f'? – jwodder

+0

要获得您似乎想要的行为,请在两个文件中使用'static int x'。 –

+1

'x'在任何函数之外声明,所以它是一个全局变量。如果你不想将'x'的作用域限制为'f()',那么你必须在'f()'中声明它(也可以把它设为'static')。如果你希望它的作用域被限制为一个源文件(比如'bar3.c'),那么一定要使它成为'static'。 –

因为x定义在任何函数的范围之外,所以它具有全局范围。所以f()分配其值的运行实际上改变了它的值,如图所示。

main()运行时,它所做的第一件事就是调用f(),它会更改该值(有些人可能会认为是副作用)。这就是为什么从未使用15213的初始值。

您已定义变量x外部在2个翻译单元中的关联。程序的行为因此是undefinedC11 6.9p5

  1. 外部定义是一个外部声明,这也是一个功能(比内联定义其他)或对象的定义。如果在表达式中使用通过外部链接声明的标识符(除了作为sizeof或_Alignof运算符(其结果为整数常量)的操作数的一部分),则在整个程序中的某处应完全是一个外部定义标识符;否则,不得超过一个。
开始=“5”>

有一个共同的扩展名(C11 J.5.11),即存在于导致这样的外部变量定义为合并成一个POSIX系统(UNIX,Mac OSX上,Linux)的:

J.5.11多重外部定义

  1. 有可能对多个外部定义对象的标识符,无论是否使用关键字extern;如果定义不一致,或者多于一个被初始化,则行为是不确定的(6.9.2)。

然而,其他平台的C编译器不一定遵循这个规则。


如果你想这两个文件有一个名为x独立变量,用关键字static,即static int x;前缀的每一个声明。如果您希望它们是可移植的,则仅在一个文件中使用int x;extern int x;;这个extern al声明可以放入一个头文件中。