什么printf打印单位变量?

该代码应该打印什么? 0或任何垃圾值还是依赖于编译器?

#include  int a; int main() { printf("%d\n",a); return 0; } 

答案是0.全局变量初始化为零。

我会说你的代码可能输出任何东西,或者只是发生任何事情,因为你的代码根据C99调用Undefined Behavior。

您没有范围内的printf原型。

J.2未定义的行为

– 对于在函数原型定义函数的范围内调用没有函数原型的函数,原型以省略号结尾或者促销后的参数类型与参数类型不兼容(6.5.2.2) )。

如果问题是关于全局变量的初始化,那么a将被初始化为0因为它具有静态存储持续时间。

我在C99标准上找到了第6.7.8.10节,初始化:

如果未显式初始化具有自动存储持续时间的对象,则其值不确定。 如果没有显式初始化具有静态存储持续时间的对象,则: – 如果它具有指针类型,则将其初始化为空指针; – 如果它有算术类型,则初始化为(正或无符号)零; – 如果是聚合,则根据这些规则初始化(递归)每个成员; – 如果它是一个联合,则根据这些规则初始化(递归)第一个命名成员。

第6.2.4.3节定义:

标识符使用外部或内部链接声明的对象,或者使用存储类说明符static声明的对象具有静态存储持续时间。 它的生命周期是程序的整个执行,它的存储值只在程序启动之前初始化一次。

换句话说,全局变量初始化为0.自动变量(即非static局部变量)不会自动初始化。

没有自动变量[通常我们在大多数情况下在函数中使用]所有其他变量的值都被赋值为0

全局变量初始化为0.自动变量(即非静态本地)不会自动初始化。