3 回答

TA貢獻1875條經驗 獲得超3個贊
簡而言之,var
未初始化,讀取未初始化的變量會導致未定義的行為。
所以不要這樣做。當您這樣做時,就不再保證您的程序可以執行您所說的任何事情。
正式地,“讀取”值表示對其執行從左到右的轉換?!?.1指出“ ...如果對象未初始化,則需要進行此轉換的程序將具有未定義的行為?!?/p>
實用上,這只是意味著該值是垃圾(畢竟,很容易看到讀取int
,例如,獲取隨機位),但是我們無法得出結論,否則您將定義未定義的行為。
舉一個真實的例子,考慮:
#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;}
天真地,人們會得出結論(通過評論中的推理),這永遠不應該印刷"impossible"
;但是如果行為不確定,一切皆有可能。用編譯g++ -02
。

TA貢獻1794條經驗 獲得超8個贊
您得到的是編譯器決定將變量解釋為整數或雙精度數的位置上堆棧中的任何數據。每次運行程序都可能是相同的,因為程序通常表現為確定性的。盡管在很多情況下,程序的最終運行結果都不相同。如果您稍稍更改了程序,或者在獲得該代碼之前根據用戶的輸入做出了決定,則可能會或可能不會獲得不同的編號。
基本上,您尚未初始化的變量的值是未指定的,并且絕對可以是任何值。沒有韻律或原因。使用未初始化的變量(從形式上來說)是未定義的行為,并且可能導致各種奇怪的事情。
這樣做通常是不好的做法。您希望程序以可預測的方式運行,并且具有未初始化的變量是不可預測性的根源。請注意,最強調的不是隨機性,而是不可預測性。如果您打開所有警告,大多數編譯器都會抱怨類似的代碼。
- 3 回答
- 0 關注
- 608 瀏覽
添加回答
舉報