在下面的程序中,输出总是为零,还是未定义的行为?
#include<iostream>
int main()
{
int i= i ^ i ;
std::cout << "i = " << i << std::endl;
}
使用 gcc 4.8.0 编译成功,输出为 0。
在下面的程序中,输出总是为零,还是未定义的行为?
#include<iostream>
int main()
{
int i= i ^ i ;
std::cout << "i = " << i << std::endl;
}
使用 gcc 4.8.0 编译成功,输出为 0。
int i= i ^ i ;
由于i
是一个自动变量(即它在自动存储期间声明),它没有(静态)初始化,但您正在读取它的值来初始化它(动态)。因此,您的代码会调用未定义的行为。
如果您i
在命名空间级别或 as声明static
,那么您的代码会很好:
命名空间级别
int i = i ^ i; //declared at namespace level (static storage duration)
int main() {}
或在本地定义为static
:
int main()
{
static int i = i ^ i; //static storage duration
}
这两个代码都很好,因为它i
是静态初始化的,因为它是在静态存储期间声明的。
未定义的行为。未初始化的垃圾实际上不必是给定类型的未知但有效的值。在某些体系结构(特别是 Itanium)上,当您尝试对其进行任何操作时,未初始化的垃圾实际上会导致崩溃。请参阅http://blogs.msdn.com/b/oldnewthing/archive/2004/01/19/60162.aspx了解 IA64 的 Not a Thing 如何让您感到困惑。