【发布时间】:2020-02-12 08:20:31
【问题描述】:
来自 6.3.2.1(强调我的)
如果左值指定了一个自动存储持续时间的对象 可以用寄存器存储类声明(从来没有 它的地址被占用),并且该对象未初始化(未声明 使用初始化程序并且之前没有对其进行分配 使用),行为未定义。
这意味着,如果无法使用寄存器存储类声明自动对象(获取它的地址):
int x;
printf("just a dummy pointer print %p", &x); //taking the address to break 6.3.2.1 UB condition
if (x == 2)
{
print("x uninitialized value: %d", x);
}
根据 6.3.2.1,if (x == 2) 中没有未定义的行为,我使用未初始化对象的值。
如果这是真的,并且这里没有 UB,那么定义的行为是什么?根据标准,x 我应该期待什么?
【问题讨论】:
-
如果您将引用的部分放在上下文中,也许我们可以给出客观的答案?例如,“行为”指的是什么?
-
@Adrian 这是 C 标准,而不是一些异国情调的书。
-
比 6.3.2.1 不相关 所以?这并不排除出于其他原因的未定义行为。这就像告诉那个闯红灯把你拦下的警察,“但我没有超速!”。
-
请注意,您不需要打印指针。像
&x;这样的无所事事声明就足以满足它不是 UB 的条件。 -
您和许多其他绝对专业人士可能通常会知道您对“6.3.2.1(强调我的)”的含义,但您能否对您所指的内容给出绝对参考?是 ANSI-C 实现吗?
标签: c language-lawyer addressof lvalue-to-rvalue register-keyword