亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

“ IB”和“ UB”到底是什么意思?

“ IB”和“ UB”到底是什么意思?

C++
忽然笑 2020-02-01 15:24:03
我已經多次看到術語“ IB”和“ UB”,尤其是在C ++中。我曾嘗試使用Google搜索,但顯然,這兩個字母的組合很有用。:P所以,我問你……當他們被說成是一件壞事時,它們是什么意思?
查看完整描述

3 回答

?
largeQ

TA貢獻2039條經驗 獲得超8個贊

IB:實施定義的行為。該標準將其留給特定的編譯器/平臺來定義精確的行為,但要求對其進行定義。

使用實現定義的行為可能會很有用,但會使代碼的可移植性降低。

UB:未定義的行為。該標準未指定調用未定義行為的程序的行為。也被稱為“鼻惡魔”,因為理論上它可以使惡魔從您的鼻子中飛出。

使用未定義的行為幾乎總是一個壞主意。即使有時看起來可行,對環境,編譯器或平臺的任何更改也可能會隨機破壞您的代碼。


查看完整回答
反對 回復 2020-02-01
?
慕妹3242003

TA貢獻1824條經驗 獲得超6個贊

實現定義的行為和未定義的行為

C ++標準非常具體地說明了各種構造的影響,尤其應該始終注意以下類別的麻煩

  • 未定義的行為意味著絕對沒有提供任何保證。該代碼可能有效,或者可能會激怒您的硬盤驅動器或使惡魔從您的鼻子中飛出來。就C ++語言而言,絕對可能發生任何事情。實際上,這通常意味著您有一個不可恢復的錯誤。如果發生這種情況,你真的不能信任任何有關應用程序(因為這個不確定的行為后果之一可能是剛被弄亂你的應用程序的其它部分使用的內存)。不需要保持一致,因此兩次運行該程序可能會得出不同的結果。這可能取決于月亮的相位,所穿襯衫的顏色或其他任何東西。

  • 未指定的行為意味著程序必須執行理智且一致的操作,但是不需要對此進行記錄

  • 實現定義的行為類似于未指定的行為,但還必須由編譯器編寫者記錄下來。一個示例是的結果reinterpret_cast。通常,它只是更改了指針的類型,而沒有修改地址,但是映射實際上是實現定義的,因此只要編譯器記錄了此選擇,它就可以映射到完全不同的地址。另一個示例是int的大小。C ++標準并不關心它是2、4還是8個字節,但是必須由編譯器記錄下來

但是所有這些共同點是最好避免它們。如果可能,請堅持使用C ++標準本身指定的100%行為。這樣,您就可以保證可移植性。

您通常還必須依賴于一些實現定義的行為。這可能是不可避免的,但您仍應注意這一點,并意識到您所依賴的東西在不同的編譯器之間可能會發生變化。

另一方面,應始終避免未定義的行為。通常,您應該只假定它會使程序以一種或另一種方式爆炸。


查看完整回答
反對 回復 2020-02-01
?
慕桂英3389331

TA貢獻2036條經驗 獲得超8個贊

  • IB:是實現定義的行為-編譯器必須記錄其行為。>>例如,對負值執行運算。

  • UB:未定義的行為-編譯器可以執行任何操作,包括簡單地崩潰或給出不可預測的結果。取消引用空指針屬于該類別,但還包括諸如指針算術之類的更巧妙的事情,它們不在數組對象的范圍之內。

另一個相關的術語是“未指明的行為”。這是實現定義的行為和未定義的行為之間的一種。對于未指定的行為,編譯器必須根據標準執行某些操作,但是標準給出的確切選擇取決于編譯器,并且不需要定義(甚至一致)。子表達式的評估順序之類的事情就屬于此類。編譯器可以按照自己喜歡的順序執行這些操作,并且可以在不同版本中甚至在同一版本的不同運行中以不同的方式執行(不太可能,但允許)。


查看完整回答
反對 回復 2020-02-01
  • 3 回答
  • 0 關注
  • 2794 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號