3 回答

TA貢獻1842條經驗 獲得超21個贊
IB:實施定義的行為。該標準將其留給特定的編譯器/平臺來定義精確的行為,但要求對其進行定義。
使用實現定義的行為可能會很有用,但會使代碼的可移植性降低。
UB:未定義的行為。該標準未指定調用未定義行為的程序的行為。也被稱為“鼻惡魔”,因為從理論上講它可以使惡魔從您的鼻子中飛出。
使用未定義的行為幾乎總是一個壞主意。即使有時看起來可行,對環境,編譯器或平臺的任何更改也可能會隨機破壞您的代碼。

TA貢獻1883條經驗 獲得超3個贊
實現定義的行為和未定義的行為
C ++標準非常具體地說明了各種構造的影響,尤其是您應該始終注意以下麻煩類別:
未定義的行為意味著絕對沒有提供任何保證。該代碼可能有效,或者可能會激怒您的硬盤驅動器或使惡魔從您的鼻子中飛出來。就C ++語言而言,絕對可能發生任何事情。實際上,這通常意味著您有一個不可恢復的錯誤。如果發生這種情況,你真的不能信任任何有關應用程序(因為這個不確定的行為后果之一可能是剛被弄亂你的應用程序的其它部分使用的內存)。不需要保持一致,因此兩次運行該程序可能會得出不同的結果。這可能取決于月亮的相位,所穿襯衫的顏色或其他任何東西。
未指定的行為意味著程序必須執行理智且一致的操作,但是不需要對此進行記錄。
實現定義的行為類似于未指定的行為,但還必須由編譯器編寫者記錄下來。一個示例是的結果
reinterpret_cast
。通常,它只需更改指針的類型,而無需修改地址,但是映射實際上是實現定義的,因此只要編譯器記錄了此選擇,它就可以映射到完全不同的地址。另一個示例是int的大小。C ++標準并不關心它是2、4還是8字節,但是必須由編譯器記錄
但是所有這些的共同點是最好避免它們。如果可能,請堅持使用C ++標準本身指定的100%行為。這樣,您就可以保證可移植性。
您通常還必須依賴于一些實現定義的行為。這可能是不可避免的,但您仍應注意它,并意識到您所依賴的內容可能會在不同的編譯器之間發生變化。
另一方面,應始終避免未定義的行為。通常,您應該僅假設它會使程序以一種或另一種方式爆炸。

TA貢獻1963條經驗 獲得超6個贊
IB:是實現定義的行為-編譯器必須記錄其行為。
>>
對負值執行運算是一個示例。UB:未定義的行為-編譯器可以做任何事情,包括簡單地崩潰或給出不可預測的結果。取消引用空指針屬于該類別,但還包括諸如指針算術之類的更巧妙的事情,它們不在數組對象的范圍之內。
另一個相關的術語是“未指明的行為”。這是實現定義的行為與未定義的行為之間的一種。對于未指定的行為,編譯器必須根據標準執行某些操作,但是標準給出的確切選擇取決于編譯器,并且不需要定義(甚至一致)。子表達式的評估順序之類的事情就屬于此類。編譯器可以按自己喜歡的順序執行這些操作,并且可以在不同的版本中甚至在同一版本的不同運行中以不同的方式執行(不太可能,但允許)。
- 3 回答
- 0 關注
- 819 瀏覽
添加回答
舉報