4

在下面的程序中,输出总是为零,还是未定义的行为?

#include<iostream>

int main()
{
    int i= i ^ i ;
    std::cout << "i = " << i << std::endl;
}

使用 gcc 4.8.0 编译成功,输出为 0。

4

2 回答 2

18
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静态初始化的,因为它是在静态存储期间声明的。

于 2013-07-05T09:46:30.330 回答
5

未定义的行为。未初始化的垃圾实际上不必是给定类型的未知但有效的值。在某些体系结构(特别是 Itanium)上,当您尝试对其进行任何操作时,未初始化的垃圾实际上会导致崩溃。请参阅http://blogs.msdn.com/b/oldnewthing/archive/2004/01/19/60162.aspx了解 IA64 的 Not a Thing 如何让您感到困惑。

于 2013-07-05T09:55:41.110 回答