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

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

“未定義的行為”真的允許*任何事情發生嗎?

“未定義的行為”真的允許*任何事情發生嗎?

C++ C
婷婷同學_ 2019-07-09 15:19:00
“未定義的行為”真的允許*任何事情發生嗎?這個問題并不是用來討論未定義行為的優點的論壇,但它就是這樣的。無論如何,這個線程是關于一個假設的C-編譯器,沒有未定義的行為。對于那些認為這是一個重要話題的人來說,可能會有更多的興趣。典型的“未定義的行為”的例子,當然是“鼻涕鬼”-不管C和C+標準允許什么,都是一種生理上的不可能。因為C和C+社區傾向于強調未定義行為的不可預見性,以及編譯器允許程序按字面順序執行的想法。什么都行當遇到未定義的行為時,我假設標準對未定義行為的行為沒有任何限制。但C+標準中的相關引用似乎是:[C++14: defns.undefined]: [..]允許的未定義行為包括:完全忽略這種情況而導致不可預測的結果;在翻譯或程序執行過程中以具有環境特征的記錄方式(無論是否發布診斷消息);終止翻譯或執行(通過發布診斷消息)。[..]這實際上指定了一組可能的選項:無視形勢-是的,標準接著說這會有“不可預測的結果”,但這和編譯器不一樣插入代碼(我認為這是鼻腔惡魔的先決條件)。以有文件記錄的方式行事,具有環境特征-實際上,這聽起來比較溫和.(我當然沒有聽說過任何有記錄的鼻涕病例。)終止翻譯或執行-用診斷法,也一樣.如果所有的UB都能表現得這么好。我假設在大多數情況下,編譯器選擇忽略未定義的行為;例如,在讀取未初始化的內存時,插入任何代碼以確保行為一致可能是一種反優化。我認為陌生人的未定義行為類型(如“時間旅行)將屬于第二類-但這需要記錄這些行為和“環境特征”(因此,我猜鼻惡魔只是由地獄的計算機產生的?)。我是不是誤解了定義?這些僅僅是實例什么可以構成未定義的行為,而不是一個全面的選項列表?所謂“任何事情都可能發生”的說法是否僅僅意味著無視形勢的意外副作用?編輯:有兩點需要澄清:我認為從最初的問題中可以看出這一點,我認為對大多數人來說都是如此,但我還是會說出來的:我確實意識到“鼻涕鬼”是開玩笑的。請不要寫(其他)答案,說明ub允許特定于平臺的編譯器優化,除非您也解釋它是如何允許優化的執行-定義行為不會允許。
查看完整描述

3 回答

?
MMMHUHU

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

是的,它允許任何事情發生。這張便條只是舉了幾個例子。定義相當明確:

未定義的行為:本國際標準對其不施加任何要求的行為。


經?;煜牡胤剑?/strong>

你應該明白“沒有要求”意味著實現是必須讓行為不被定義,或者做一些奇怪的或不確定的事情!

C+標準完全允許該實現記錄一些正常的行為并相應地進行操作。1因此,如果您的編譯器聲稱要對簽名溢出進行包裝,那么邏輯(是否正確?)就意味著你可以依靠這種行為關于那個編譯器..只是不要指望另一個編譯器會以同樣的方式運行,如果它不聲稱的話。

1見鬼,它甚至可以記錄一件事,做另一件事。這將是愚蠢的,它可能會讓你把它扔進垃圾桶-你為什么要相信一個編譯器,它的文檔對你來說是假的?-但這并不違反C+標準。


查看完整回答
反對 回復 2019-07-09
?
白衣非少年

TA貢獻1155條經驗 獲得超0個贊

未定義行為的歷史目的之一是允許某些行為有不同的可能性。可能有用對不同平臺的影響。例如,在C的早期,

int i=INT_MAX;i++;printf("%d",i);

一些編譯器可以保證代碼會打印一些特定的值(對于兩個互補機器,通常是int_min),而另一些編譯器則保證程序將在不到達printf的情況下終止。根據應用程序的需求,這兩種行為都可能是有用的。保留未定義的行為意味著,如果程序終止異常是溢出導致的可接受的后果,但產生看似有效但錯誤的輸出,則可能會放棄溢出檢查,如果運行在一個平臺上,該平臺將可靠地捕獲溢出,而在溢出情況下出現異常終止的應用程序將無法接受,但如果在沒有捕獲溢出的平臺上運行,則會產生算術錯誤的輸出,則可能會放棄溢出檢查。

然而,最近,一些編譯器作者似乎參與了一場競賽,看誰能最有效地消除標準不允許存在的任何代碼。比如說.。

#include <stdio.h>int main(void){
  int ch = getchar();
  if (ch < 74)
    printf("Hey there!");
  else
    printf("%d",ch*ch*ch*ch*ch);}

超現代編譯器可能會得出結論,如果ch的計算值為74或更大。ch*ch*ch*ch*ch會產生未定義的行為,因此程序應該打印“嘿!”無條件地不管輸入了什么字符。


查看完整回答
反對 回復 2019-07-09
?
神不在的星期二

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

挑剔:你沒有引用標準。

這些是用來生成C+標準草案的源。這些來源不應被視為ISO出版物,除非C+工作組正式通過這些來源產生的文件(ISO/IEC JTC 1/SC 22/WG21)。

解釋*注釋不是規范性根據ISO/IEC指令第二部分。

納入文件案文的說明和例子只能用于提供旨在協助理解或使用該文件的補充信息。它們不應包含要求(“應”;見3.3.1和表H.1)或任何被認為對文件的使用必不可少的信息例如指示(祈使句;見表H.1),建議(“應”;見3.3.2和表H.2)或許可(“可”;見表H.3)。筆記可以寫成事實陳述。

強調我的。僅這一點就排除了“全面的備選方案清單”。然而,舉一些例子確實可以算作“旨在幫助理解該文件的補充資料”。

一定要記住,“鼻惡魔”模因并不是字面意義上的,就像用氣球解釋宇宙膨脹是如何工作的一樣,在物理實相中沒有真理。這是為了說明討論什么“未定義的行為”是魯莽的在允許做任何事情的時候做。是的,這意味著外層空間沒有實際的橡皮筋。


查看完整回答
反對 回復 2019-07-09
  • 3 回答
  • 0 關注
  • 598 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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