2011-12-14 95 views
2

以下是否会调用未定义的行为?初始化不确定值的对象

int x; 
int i = x; 

从C++ 03

(4.1/1)如果到所述左值是指该对象不是类型T 的目的,而不是衍生自类型的对象参考T或如果对象是 未初始化,则需要此转换的程序有 未定义的行为。

编辑: 然而,从(3.3.1/1)的对象可以与它自己的indetermine值进行初始化,这是为什么?即

int x = x; //not an undefined behaviour 
+0

我想说这取决于你使用的编译器。但是,对于程序员来说,这主要是一个未定义的行为。通常,你会在`x`和`i`上得到垃圾。 – frarees 2011-12-14 20:57:40

+0

@frarees“_it取决于编译器_”否。某些东西要么定义了行为,要么没有。 – curiousguy 2011-12-14 21:40:06

+0

嗯,我刚刚说过,因为我听说有些编译器在定义时假定值为0,没有赋值。另外,在这种情况下,当我谈论行为时,我指的是它最终得到的值。 – frarees 2011-12-14 22:04:44

回答

6

是的,因为您正在读取未初始化和未分配的变量值(x)。

0

它调用完全定义的行为。无论在堆栈中分配时的x值是什么,都将按原样分配给i。

但是,根据您的编译器,您可能会收到关于引用未初始化变量的编译时警告。

+2

不,访问未初始化和未分配变量的值是UB。 – 2011-12-14 20:54:57

+0

@SethCarnegie:这是否意味着如果值`x`碰巧是`3`,那么`i`的值可能与`3`不同? – Dennis 2011-12-14 21:02:00

0

如您的报价中所述,如果x未初始化,则不确定。

int x; // 0 initialized 
int i = x; 

int main() { 
    int z; // not initialized 
    int k = z; // UB 
} 
0

要记住的唯一的事情是,这是好的:

static int x; 
int j = x; 

,但你的例子是没有的。

0

int x = x; //不是未定义的行为

错误。