代码应该打印什么?0或任何垃圾值,还是取决于编译器?
#include <stdio.h>
int a;
int main()
{
printf("%dn",a);
return 0;
}
答案是0。全局变量初始化为零。
说你的代码可能会输出任何东西,或者只是任何事情都可能发生,因为你的代码根据 C99 调用未定义的行为。
您没有范围内printf
的原型。
J.2 未定义的行为
— 对于在函数原型定义函数的范围内调用没有函数原型的函数,原型以省略号结尾,或者升级后的参数类型与参数的类型不兼容 (6.5.2.2)。
如果问题是关于全局变量的初始化,那么a
将被初始化为 0
,因为它具有静态存储持续时间。
我在 C99 标准第 6.7.8.10 节,初始化中找到:
如果未显式初始化具有自动存储持续时间的对象,则其值为 定。如果未显式初始化具有静态存储持续时间的对象, 然后: — 如果它具有指针类型,则将其初始化为空指针; — 如果它具有算术类型,则将其初始化为(正数或无符号)零; — 如果它是一个聚合,则根据这些规则(递归地)初始化每个成员; — 如果它是一个联合,则根据这些初始化(递归)第一个命名成员 规则。
第6.2.4.3节定义:
使用外部或内部链接声明其标识符的对象,或者使用 存储类说明符 static 具有静态存储持续时间。它的生命周期是整个 程序的执行及其存储的值仅在程序之前初始化一次 启动。
换句话说,全局变量初始化为 0。自动变量(即非static
局部变量)不会自动初始化。
没有自动变量[通常我们在大多数情况下在函数中使用的变量]所有其他变量的值都分配给 0
全局变量初始化为 0。自动变量(即非静态局部变量)不会自动初始化。