#include <iostream>
int j;
int main(void) {
int i;
std::cout<<i<<std::endl;
std::cout<<j<<std::endl;
return 0;
}
i可以是不同的值还是始终为 0 ?适合初始吗?这对我来说是意外的结果吗?
#include <iostream>
int j;
int main(void) {
int i;
std::cout<<i<<std::endl;
std::cout<<j<<std::endl;
return 0;
}
i可以是不同的值还是始终为 0 ?适合初始吗?这对我来说是意外的结果吗?
您的程序具有未定义的行为,因为它需要对具有不确定值的对象进行左值到右值的转换(参见 C++11 标准的第 4.1/1 段)。
简单来说,i
没有任何明确定义的值,因为您没有对其进行初始化,并且尝试读取其(非)值是未定义的行为。
根据 C++11 标准的第 8.5/7 段:
默认初始化类型的对象
T
意味着:— 如果是(可能是 cv 限定的)类类型(第 9 条),则调用 T 的默认构造函数(如果没有可访问的默认构造函数
T
,则初始化是非良构的);T
— 如果
T
是数组类型,则每个元素都是默认初始化的;—否则,不执行初始化。
此外,根据第 8.5/12 段:
如果没有为对象指定初始化器,则该对象是默认初始化的;如果不执行初始化,则具有自动或动态存储持续时间的对象具有不确定值。[...]
i 没有预定义(默认)值。默认情况下,某些环境可能会将其设置为零(Visual Studio 调试器在几个版本前曾经这样做过 - 我不知道它是否仍然这样做)。
i 的值未定义。在实践中,该值可能取自堆栈内存中所分配地址的任何内容。