我在这里阅读了很多,并且在cppreference中自动POD类型没有默认初始化,但我尝试测试一些代码,我有一些奇怪的结果。看:
#include <iostream>
int main( ) {
int x;
std::cout << "x: " << x << std::endl;
return 0;
}
它将输出 x 一些随机值。但是,如果我像这样修改我的代码:
#include <iostream>
void f( ) {
int i;
std::cout << "i: " << i << std::endl;
}
int main( ) {
f( );
int x;
std::cout << "x: " << x << std::endl;
return 0;
}
我将得到以下输出:
i: 0
x: 4200814
如果我在声明x及其输出后修改函数调用f( );
的顺序,则 x 和 i 都将设置为a随机值。另一件事:如果在声明x及其输出之后声明另一个没有初始化的变量,如int y;
,y也会输出0。
那么,为什么变量 i 以及可能在函数 f 中声明的所有其他变量被'初始化'为0.可能是欠定义行为或不确定值的结果?< / p>
答案 0 :(得分:1)
我在这里阅读了很多内容,并在cppreference中自动POD类型未默认初始化,
这是不正确的。未明确初始化对象时,将默认初始化该对象。根据类型默认初始化更改意味着什么。
来自C ++ 11标准:
8.5初始化程序
...
6要默认初始化,
T
类型的对象意味着:- 如果
T
是(可能是cv限定的)类类型(第9条),则调用T
的默认构造函数(如果T
,则初始化不正确没有可访问的默认构造函数);- 如果
T
是数组类型,则每个元素都是默认初始化的;- 否则,不执行初始化。
因此,不会对x
和i
执行初始化。
可能是行为不明确或价值不确定的结果?
是。使用未初始化变量的值是未定义行为的原因。
i
和x
的值可以是任何值。不要依赖任何特定的模式。
重新编译时,当您更改编译器选项时,更改编译器时,它们的值很可能会发生变化。