2011-12-14 127 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; //不是未定義的行爲

錯誤。