【发布时间】:2013-07-17 15:20:52
【问题描述】:
C99 标准是否允许将变量分配给自己?例如,以下是否有效:
int a = 42;
/* Case 1 */
a = a;
/* Case 2 */
int *b = &a;
a = *b;
虽然我怀疑案例 1 是有效的,但对于案例 2,我很犹豫。
在赋值的情况下,右侧是否在将值分配给左侧的变量之前完全评估了 - 或者是在取消引用指向被分配变量的指针时引入的竞争条件?
【问题讨论】:
-
a = a;是高级语言中的死指令,我很确定优化阶段会删除它 -
@GrijeshChauhan 如果 a 在内存中并且不需要优化,则并非总是如此。请参阅下面的示例。
-
只要变量已经正确初始化,应该没问题。如果变量未初始化,则复制未初始化的值不会使其更好地初始化。如果变量是
volatile,它可能不是空操作(编译器有义务读取该值并写入再次读回的值)。当变量不符合volatile时,它应该是空操作。
标签: c pointers c99 language-lawyer