【发布时间】:2014-09-24 07:12:06
【问题描述】:
考虑这个程序:
#include <stdio.h>
int main(void)
{
unsigned int a;
printf("%u %u\n", a^a, a-a);
return 0;
}
这是未定义的行为吗?
从表面上看,a 是一个未初始化的变量。所以这指向未定义的行为。但是对于a 的所有值,a^a 和a-a 等于0,至少我认为是这样。是否有可能通过某种方式证明该行为是明确定义的?
【问题讨论】:
-
我希望这是明确定义的,因为 a 的值是未知的但固定的,它不应该改变。问题是编译器是否会为
a分配空间并随后从坐在那里的垃圾中读取。如果不是,则行为未定义。 -
嗯,只要变量没有被标记为
volatile,那么我会接受它作为定义的行为。a ^= a,完全等价于a = 0 -
@martin:这不是固定的。该值允许更改。这是一个非常实际的考虑。一个变量可以分配给一个 CPU 寄存器,但是当它未初始化时(即它的有效值生命周期尚未开始),同一个 CPU 寄存器可以被不同的变量占用。该其他变量的变化将被视为此未初始化变量的“不稳定”值。这是在使用未初始化变量的实践中经常观察到的。
-
@AndreyT 这是一个很好的解释
-
没关系,找到了,我的错误:stackoverflow.com/questions/20300665/…,实际上是 C.
标签: c undefined-behavior