Khu*_*hid 4 c++ language-lawyer
在以下程序中,输出始终为零或未定义的行为?
#include<iostream>
int main()
{
int i= i ^ i ;
std::cout << "i = " << i << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
用gcc 4.8.0这段代码编译成功,输出为0.
Naw*_*waz 18
int i= i ^ i ;
Run Code Online (Sandbox Code Playgroud)
由于i是自动变量(即它在声明自动存储时间),它是不是(静态)初始化但你读它的值初始化(动态).所以你的代码会调用未定义的行为.
如果你i在命名空间级别或者声明static,那么你的代码就可以了:
命名空间级别
int i = i ^ i; //declared at namespace level (static storage duration)
int main() {}
Run Code Online (Sandbox Code Playgroud)或者在本地定义,但是static:
int main()
{
static int i = i ^ i; //static storage duration
}
Run Code Online (Sandbox Code Playgroud)这两个代码都很好,因为它i是静态初始化的,因为它是在静态存储持续时间中声明的.
未定义的行为.未初始化的垃圾实际上不必是给定类型的未知但有效的值.在某些体系结构(特别是Itanium)上,当您尝试使用它时,未初始化的垃圾实际上会导致崩溃.请参阅http://blogs.msdn.com/b/oldnewthing/archive/2004/01/19/60162.aspx,了解IA64的Not Thing如何搞砸你.
| 归档时间: |
|
| 查看次数: |
497 次 |
| 最近记录: |