《C專家編程》一1.6 它很棒,但它符合標準嗎

本節書摘來自異步社區《C專家編程》一書中的第1章,第1.6節,作者 【美】Perter Van Der Linde,更多章節內容可以訪問云棲社區“異步社區”公眾號查看

1.6 它很棒,但它符合標準嗎

不要添亂——立即解散ISO工作小組。

——匿名人士

ANSI C標準可以說是非常獨特的,我們可以從好幾個有趣的方面來說明這一點。它定義了下面一些術語,用于描述某種編譯器的特點。如果你對這些術語有一個比較好的了解,就有助于你理解什么東西能被語言接受,什么東西不能被語言接受。前兩個術語涉及不可移植的代碼(unportable code),接下來的兩個術語跟壞代碼(bad code)有關,而最后兩個術語則跟可移植的代碼(portable code)有關。

不可移植的代碼(unportable code):

由編譯器定義的(implementation-defined)——由編譯器設計者決定采取何種行動(就是說,在不同的編譯器中所采取的行為可能并不相同,但它們都是正確的),并作好文檔記錄。

例如:當整型數向右移位時,要不要擴展符號位。

未確定的(unspecified)——在某些正確情況下的做法,標準并未明確規定應該怎樣做。

例如:參數求值的順序。

壞代碼(bad code):

未定義的(undefined)——在某些不正確情況下的做法,但標準并未規定應該怎樣做。你可以采取任何行動,可以什么也不做,也可以發出一條警告信息,或者可以中止程序以及讓CPU陷入癱瘓,甚至可以發射核導彈(只要你安裝了能發射核彈的硬件系統)。

例如:當一個有符號整數溢出時該采取什么行動。

約束條件(a constraint)——這是一個必須遵守的限制或要求。如果你不遵守,那么你的程序的行為就會變成像上面所說的屬于未定義的。這就出現了一種很有意思的情況:分辨某種東西是否是一個約束條件是很容易的,因為標準的每個主題都附有一個“約束(constraint)”小節,列出了所有的約束條件。現在又出現了一個更為有趣的情況:標準規定[5]編譯器只有在違反語法規則和約束條件的情況下才能產生錯誤信息!這意味著所有不屬于約束條件的語義規則你都可以不遵循,而且由于這種行為屬于未定義行為,編譯器可以采取任何行動,甚至不必通知你!

例如:%操作符的操作數必須屬于整型。所以,在非整數數據上使用%操作符肯定會引發一條錯誤信息。

不屬于約束條件規則的例子:所有在C語言標準頭文件中聲明的標識符均保留,所以不能聲明一個叫作malloc()的函數,因為在標準頭文件里已經有一個函數以此為名。但由于這個規定不是約束條件,因此可以違反它,而且編譯器甚至可以不警告你!關于“interpositioning”這一小節的更多內容,參見第5章。


1744f65d1127c9e86d0fa3cfd9afc8ba33245468

未定義的行為在IBM PC中引起CPU癱瘓!

未定義的軟件行為引起CPU癱瘓的說法并不像它乍聽上去那樣牽強。

IBM PC的顯示器以顯示控制芯片所提供的水平掃描速率工作。回掃變壓器(flyback transformer,一種產生高電壓的裝置,用于加速電子以點亮顯示器上的熒光物質)需要保持一個合理的頻率。

然而在軟件中,程序員有可能把視頻芯片的掃描速率設置成零,這樣就會產生一個恒定的電壓輸出到回歸變壓器的輸入端。這就使它起了電阻器的作用,只是把電能轉換成熱能,而不是傳送到屏幕。這會在數秒之內就把顯示器燒毀,那就是未定義的軟件行為會導致系統癱瘓的理由。
可移植的代碼(portable code):

嚴格遵循標準的(strictly-conforming)—— 一個嚴格遵循標準的程序應該是:

只使用已確定的特性。

不突破任何由編譯器實現的限制。

不產生任何依賴由編譯器定義的或未確定的或未定義的特性的輸出。

這樣規定的主要目的就是最大限度地保證可移植性。這樣,不論你在什么平臺上運行嚴格遵循標準的程序都會產生相同的輸出。事實上,在所有遵循標準的程序中,屬于這一類的程序并不多。例如,下面這個程序就不是嚴格遵循標準的:

#include <limits.h>
#include <stdio.h>
int main() { (void)printf("biggest int is %d", INT_MAX); return 0;}/*并不嚴格遵循標準:其輸出結果是由編譯器定義的。*/

在本書的剩余部分,我們通常并不強求例子程序嚴格遵循標準。因為如果這樣做會使文本看上去比較亂,而且不利于理解所討論的要點。程序的可移植性是非常重要的,所以在你的現實編碼中,應該始終要保證加上必要的類型轉換、返回值等。

遵循標準的(conforming)——一個遵循標準的程序可以依賴一些某種編譯器特有的不可移植的特性。所以,一個程序有可能在一個特定的編譯器里是遵循標準的,但在另一個編譯器里卻是不遵循標準的。它可以進行擴展,但這些擴展不能修改嚴格遵循標準的程序的行為。但是,這個規則并不是一個約束條件,所以對于你的程序中不遵循標準之處,你不要指望編譯器會給出一條警告信息指出你違反了規定!

上面所舉的幾個程序實例都是遵循標準的。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/396035.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/396035.shtml
英文地址,請注明出處:http://en.pswp.cn/news/396035.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

abap al設置單元格可編輯 oo_excel表格操作: 圖形和圖表編輯技巧匯總(二)

1. 快速選取圖表元素圖表創建好以后&#xff0c;我們還需要對某些圖表元素進行編輯和格式化。圖表區包括整個圖表和它的全部元素&#xff0c;當你選取圖表區后&#xff0c;你就可以看到8個黑色小方塊。要想調整單個的圖表對象&#xff0c;首先必須選取該對象&#xff0c;然后更…

trie樹查找前綴串_Trie數據結構(前綴樹)

trie樹查找前綴串by Julia GeistJulia蓋斯特(Julia Geist) A Trie, (also known as a prefix tree) is a special type of tree used to store associative data structuresTrie (也稱為前綴樹)是一種特殊類型的樹&#xff0c;用于存儲關聯數據結構 A trie (pronounced try) g…

我的北航故事

我的北航故事 致 沙航的我 既然是故事&#xff0c;那就一定少不了我們耳熟能詳的時間&#xff0c;地點&#xff0c;人物&#xff0c;事件&#xff0c;發展&#xff0c;高潮&#xff0c;結局。經過反復的琢磨&#xff0c;我覺得還是寫成日記形式比較適合&#xff0c;一是為了掩蓋…

oppo r11 android版本,OPPO R11手機一共有幾個版本?各版本都有哪些區別?

OPPO正式發布了新一代R11和R11 Plus兩款旗艦手機&#xff0c;那么OPPO R11有幾個版本&#xff1f;OPPO R11各個版本有什么區別&#xff1f;下面帶來OPPO R11各版本區別對比詳細評測&#xff0c;一起來了解下吧!外觀方面&#xff0c;采用微弧面設計&#xff0c;全新打磨輕薄“小…

CDB和PDB的創建、連接、啟動、關閉

CDB和PDB的創建、連接、啟動、關閉 一、CDB和PDB基本管理 基本概念&#xff1a; Multitenant Environment&#xff1a;多租戶環境 CDB&#xff08;Container Database&#xff09;&#xff1a;數據庫容器 PD&#xff08;Pluggable Database&#xff09;&#xff1a;可插拔數據庫…

《Java和Android開發學習指南(第2版)》——第2章,第2.10節本章小結

本節書摘來自異步社區《Java和Android開發學習指南&#xff08;第2版&#xff09;》一書中的第2章&#xff0c;第2.10節本章小結&#xff0c;作者 【加】Budi Kurniawan&#xff0c;更多章節內容可以訪問云棲社區“異步社區”公眾號查看 2.10 本章小結本章介紹了Java語言的基礎…

控制usb掃碼槍_無線也可以很牢靠-世達SATA熱熔膠槍評測

作為一名喜歡動手制作的手工達人&#xff0c;往往樂趣就在于動手過程中的成就感。而在對零件進行固定時&#xff0c;熱熔膠由于可以包裹裸露的電線線頭&#xff0c;固定效果也非常好&#xff0c;相比電焊也更加的簡單易操作&#xff0c;因而被很多人選擇。但是&#xff0c;多數…

測試驅動開發 測試前移_為什么測試驅動的開發有用?

測試驅動開發 測試前移有關如何更有效地應用TDD的技巧&#xff0c;以及為什么它是一種有價值的技術 (Tips on how to apply TDD more efficiently, and why its a valuable technique) Theres a common pattern we follow when we start a project using TDD. We describe the …

Anaconda管理多版本的python環境

通過Conda的環境管理功能&#xff0c;我們能同時安裝多個不同版本的Python&#xff0c;并能根據需要自由切換。下面我將給大家分享一下&#xff0c;新增Python版本&#xff0c;切換&#xff0c;再切回主版本的詳細過程。 方法/步驟 1首先確保你的系統里已經安裝了Conda&#xf…

父子滬c轉大牌過戶_機動車異地過戶(轉籍)

最近我家換了一輛車&#xff0c;導航后臺數據統計是去足浴城最多的車主&#xff0c;尬&#xff01;從想起這個品牌到付定金&#xff0c;也就半天時間&#xff0c;買之前沒了解這么透徹。不過&#xff0c;到手駕駛&#xff0c;還是比之前的車舒適很多的&#xff0c;就是容易在不…

android安卓系統2.3 使用說明書,Android2.3操作界面

Android2.3操作界面摩托羅拉XT882的界面相對于原生的Gingerbread還是有了不小的變化&#xff0c;首先最大的感覺就是主色調亮了很多。默認背景在qHD分辨率下非常的清晰&#xff0c;同時整個界面仍然采用了多分屏界面。下方由中國電信定制&#xff0c;狀態欄加入了全新的單個狀態…

《運營力——微信公眾號 設計 策劃 客服 管理 一冊通》一一1.2 團隊崗位介紹...

本節書摘來自異步社區出版社《運營力——微信公眾號 設計 策劃 客服 管理 一冊通》一書中的第1章&#xff0c;第1.2節&#xff0c;作者&#xff1a; 杭州創博通信技術有限公司 , 施瑤君&#xff0c;更多章節內容可以訪問云棲社區“異步社區”公眾號查看。 1.2 團隊崗位介紹 創…

一切都是關于“ –ilities”的

by George Stepanek通過喬治斯蒂芬內克 都是關于“邪惡”的 (It’s all about the “-ilities”) We were “feature complete.”我們“功能齊全”。 Four weeks into a 10-week Free Code Camp project to build an environmental pledge web application, we had gotten al…

1,滑動驗證,前后臺接口

http://www.geetest.com/install/sections/idx-client-sdk.html 轉載于:https://www.cnblogs.com/yexiangwang/p/5481153.html

Linux 下 nginx反向代理與負載均衡

前面幾篇記錄下nginx的基本運功&#xff0c;代理服務器的訪問&#xff0c;這里來試驗下nginx的反向代理。 反向代理&#xff08;Reverse Proxy&#xff09;方式是指以代理服務器來接受internet上的連接請求&#xff0c;然后將請求轉發給內部網絡上的服務器&#xff0c;并將從服…

android 8.1沒聲音,Android 8.1重大改變!耳機孔不見了

原標題&#xff1a;Android 8.1重大改變&#xff01;耳機孔不見了今天上午&#xff0c;Android Police爆料稱&#xff0c;下一代的Pixel 2將首發Android 8.1。更重要的是&#xff0c;在這個新系統中&#xff0c;谷歌已經做好了放棄3.5mm耳機插口的準備&#xff0c;并將在底層優…

php變量前下滑_PHP變量

變量來源于數學&#xff0c;是計算機語言中能儲存計算結果或能表示值抽象概念。變量可以通過變量名訪問。變量是存儲數據的“容器”。命名規則變量以 $ 符號開始&#xff0c;后面跟著變量的名稱變量名必須以字母或者下劃線字符開始變量名只能包含字母數字字符以及下劃線(A-Z、a…

《計算機科學概論(第12版)》—第0章0.3節學習大綱

本節書摘來自異步社區《計算機科學概論&#xff08;第12版&#xff09;》一書中的第0章0.3節學習大綱&#xff0c;作者【美】J. 格倫?布魯克希爾&#xff08;J. Glenn Brookshear&#xff09; , 丹尼斯?布里羅&#xff08;Dennis Brylow&#xff09;,更多章節內容可以訪問云棲…

blued停止郵箱注冊_停止讓我注冊!

blued停止郵箱注冊by Conor Sheehan由Conor Sheehan 停止讓我注冊&#xff01; (Stop Making Me Sign Up!) Installing a new app can be exciting. When you’ve found one that may be just what you need, opening it is like unboxing a new toy. So why do so many apps …

Android Sutido 編譯速度優化

雖然Android Studio 此時已經更新到了Android Studio 2.1版本&#xff0c;build 版本android-studio-bundle-143.2739321。但是在安裝該版本都是根據自己的標準進行安裝&#xff0c;所以需要在安裝之后進行一系列的調整。下面文章根據3個方面進行講解。分別為Android Studio本身…