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