初始化不确定值的对象
以下是否会调用未定义的行为?初始化不确定值的对象
int x;
int i = x;
从C++ 03
(4.1/1)如果到所述左值是指该对象不是类型T 的目的,而不是衍生自类型的对象参考T或如果对象是 未初始化,则需要此转换的程序有 未定义的行为。
编辑: 然而,从(3.3.1/1)的对象可以与它自己的indetermine值进行初始化,这是为什么?即
int x = x; //not an undefined behaviour
是的,因为您正在读取未初始化和未分配的变量值(x
)。
它调用完全定义的行为。无论在堆栈中分配时的x值是什么,都将按原样分配给i。
但是,根据您的编译器,您可能会收到关于引用未初始化变量的编译时警告。
不,访问未初始化和未分配变量的值是UB。 – 2011-12-14 20:54:57
@SethCarnegie:这是否意味着如果值`x`碰巧是`3`,那么`i`的值可能与`3`不同? – Dennis 2011-12-14 21:02:00
如您的报价中所述,如果x
未初始化,则不确定。
int x; // 0 initialized
int i = x;
int main() {
int z; // not initialized
int k = z; // UB
}
要记住的唯一的事情是,这是好的:
static int x;
int j = x;
,但你的例子是没有的。
int x = x; //不是未定义的行为
错误。
我想说这取决于你使用的编译器。但是,对于程序员来说,这主要是一个未定义的行为。通常,你会在`x`和`i`上得到垃圾。 – frarees 2011-12-14 20:57:40
@frarees“_it取决于编译器_”否。某些东西要么定义了行为,要么没有。 – curiousguy 2011-12-14 21:40:06
嗯,我刚刚说过,因为我听说有些编译器在定义时假定值为0,没有赋值。另外,在这种情况下,当我谈论行为时,我指的是它最终得到的值。 – frarees 2011-12-14 22:04:44