0

最简单的例子:

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

未指明的行为

行为,这是由于使用未指定的值或本文档提供两个

我们知道该程序具有未指定的行为。

这种推理在哪里失败?

4

1 回答 1

1

这种推理在哪里失败?

一个失败在这里

因为表示int永远不是陷阱

int可以有陷阱表示。

唯一不能有陷阱表示的类型是unsigned char

但标准中也有这部分描述未定义的行为(来自草案 n1570):

J.2 未定义的行为

...

在需要指定对象的值但对象未初始化的上下文中使用一个左值,该左值指定可以使用寄存器存储类声明的自动存储持续时间的对象。(6.3.2.1)。

于 2021-08-25T07:03:17.060 回答