以下是否會調用未定義的行爲?初始化不確定值的對象
int x;
int i = x;
從C++ 03
(4.1/1)如果到所述左值是指該對象不是類型T 的目的,而不是衍生自類型的對象參考T或如果對象是 未初始化,則需要此轉換的程序有 未定義的行爲。
編輯: 然而,從(3.3.1/1)的對象可以與它自己的indetermine值進行初始化,這是爲什麼?即
int x = x; //not an undefined behaviour
以下是否會調用未定義的行爲?初始化不確定值的對象
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