最简单的例子:
int a;
printf("%d\n", a); //Is this Undefined or Unspecified behavior?
N2346/6.3.2.1p2
:
如果左值指定了一个可以使用寄存器存储类声明的具有自动存储持续时间的对象(从未使用过它的地址),并且该对象未初始化(未使用初始化程序声明并且在使用之前未对其进行分配),行为未定义。
但是N2346/6.7.9p10
:
如果具有自动存储持续时间的对象未显式初始化,则其值是不确定的。
所以我们可以得出结论,对象被初始化为某个不确定的值。不确定的值在
N2346/3.19.2p1
:
不确定值
未指定的值或陷阱表示
由于表示int
永远不是陷阱和应用N2346/3.4.4p1
未指明的行为
行为,这是由于使用未指定的值或本文档提供两个
我们知道该程序具有未指定的行为。
这种推理在哪里失败?