0
 #include <iostream>


int j;

 int main(void) {


     int i;
     std::cout<<i<<std::endl;
     std::cout<<j<<std::endl;

     return 0;
}

i可以是不同的值还是始终为 0 ?适合初始吗?这对我来说是意外的结果吗?

4

2 回答 2

6

您的程序具有未定义的行为,因为它需要对具有不确定值的对象进行左值到右值的转换(参见 C++11 标准的第 4.1/1 段)。

简单来说,i没有任何明确定义的值,因为您没有对其进行初始化,并且尝试读取其(非)值是未定义的行为。

根据 C++11 标准的第 8.5/7 段:

默认初始化类型的对象T意味着:

— 如果是(可能是 cv 限定的)类类型(第 9 条),则调用 T 的默认构造函数(如果没有可访问的默认构造函数T,则初始化是非良构的);T

— 如果T是数组类型,则每个元素都是默认初始化的;

否则,不执行初始化

此外,根据第 8.5/12 段:

如果没有为对象指定初始化器,则该对象是默认初始化的;如果不执行初始化,则具有自动或动态存储持续时间的对象具有不确定值。[...]

于 2013-05-24T13:36:15.483 回答
0

i 没有预定义(默认)值。默认情况下,某些环境可能会将其设置为零(Visual Studio 调试器在几个版本前曾经这样做过 - 我不知道它是否仍然这样做)。

i 的值未定义。在实践中,该值可能取自堆栈内存中所分配地址的任何内容。

于 2013-05-24T13:39:31.130 回答