I可以是不同的值或总是0在这个代码示例中的c++

is i can be different value or always be 0 in this code sample in c++

本文关键字:代码 c++ 是不同      更新时间:2023-10-16
 #include <iostream>

int j;
 int main(void) {

     int i;
     std::cout<<i<<std::endl;
     std::cout<<j<<std::endl;
     return 0;
}

is i可以是不同的值或始终为0?首字母对吗?这是意料之外的结果吗?

你的程序有未定义的行为,因为它需要在一个值不确定的对象上进行左值到右值的转换(参见c++ 11标准的4.1/1段)。

简单来说,i没有任何定义良好的值,因为您没有初始化它,并且试图读取它的(非)值是未定义的行为。

c++ 11标准第8.5/7段:

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

-如果T是一个(可能是cv限定的)类类型(第9条),则调用T的默认构造函数(和如果T没有可访问的默认构造函数,则初始化是病态的);

-如果T是数组类型,每个元素默认初始化;

- ,否则不进行初始化。

同样,根据第8.5/12段:

如果对象没有指定初始化式,则对象默认初始化;如果未初始化,则使用具有自动或动态存储时间的对象具有不确定值。[…]

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

i的值未定义。在实际操作中,该值可能会从分配的地址处的堆栈内存中获取。