3 回答

TA貢獻(xiàn)1875條經(jīng)驗(yàn) 獲得超3個(gè)贊
簡(jiǎn)而言之,var
未初始化,讀取未初始化的變量會(huì)導(dǎo)致未定義的行為。
所以不要這樣做。當(dāng)您這樣做時(shí),就不再保證您的程序可以執(zhí)行您所說的任何事情。
正式地,“讀取”值表示對(duì)其執(zhí)行從左到右的轉(zhuǎn)換?!?.1指出“ ...如果對(duì)象未初始化,則需要進(jìn)行此轉(zhuǎn)換的程序?qū)⒕哂形炊x的行為?!?/p>
實(shí)用上,這只是意味著該值是垃圾(畢竟,很容易看到讀取int
,例如,獲取隨機(jī)位),但是我們無法得出結(jié)論,否則您將定義未定義的行為。
舉一個(gè)真實(shí)的例子,考慮:
#include <iostream>const char* test(){ bool b; // uninitialized switch (b) // undefined behavior! { case false: return "false"; // garbage was zero (zero is false) case true: return "true"; // garbage was non-zero (non-zero is true) default: return "impossible"; // options are exhausted, this must be impossible... }}int main(){ std::cout << test() << std::endl;}
天真地,人們會(huì)得出結(jié)論(通過評(píng)論中的推理),這永遠(yuǎn)不應(yīng)該印刷"impossible"
;但是如果行為不確定,一切皆有可能。用編譯g++ -02
。

TA貢獻(xiàn)1794條經(jīng)驗(yàn) 獲得超7個(gè)贊
您得到的是編譯器決定將變量解釋為整數(shù)或雙精度數(shù)的位置上堆棧中的任何數(shù)據(jù)。每次運(yùn)行程序都可能是相同的,因?yàn)槌绦蛲ǔ1憩F(xiàn)為確定性的。盡管在很多情況下,程序的最終運(yùn)行結(jié)果都不相同。如果您稍稍更改了程序,或者在獲得該代碼之前根據(jù)用戶的輸入做出了決定,則可能會(huì)或可能不會(huì)獲得不同的編號(hào)。
基本上,您尚未初始化的變量的值是未指定的,并且絕對(duì)可以是任何值。沒有韻律或原因。使用未初始化的變量(從形式上來說)是未定義的行為,并且可能導(dǎo)致各種奇怪的事情。
這樣做通常是不好的做法。您希望程序以可預(yù)測(cè)的方式運(yùn)行,并且具有未初始化的變量是不可預(yù)測(cè)性的根源。請(qǐng)注意,最強(qiáng)調(diào)的不是隨機(jī)性,而是不可預(yù)測(cè)性。如果您打開所有警告,大多數(shù)編譯器都會(huì)抱怨類似的代碼。
- 3 回答
- 0 關(guān)注
- 599 瀏覽
添加回答
舉報(bào)