奇怪的C語言特性

來源:互聯網
上載者:User

下面列出的特性未必奇怪,有的算是有趣。

1)a[2] 等價於 2[a]

"aabbccdd"[5] 等價於 5["aabbccdd"]

這條特性可以用於使用數組、指標、字串,但不能用在變數定義時。K&R C Programming language 217頁對此有介紹。

2)二元、三元複合字元

http://en.wikipedia.org/wiki/Digraphs_and_trigraphs

字串字面值??!將被認為是|,所以兩個問號同時出現在字串的時候一定要小心。二元複合字元在C99被引入,如<:等價於[

3)Duff's Device

http://en.wikipedia.org/wiki/Duff%27s_device

特點是switch與while交錯出現。代碼類似

4)同名同姓現象

在《C陷阱與缺陷》中有詳細解釋。

5)a[i++]= i;

這個好像是依賴特定編譯器實現,我在Xcode實驗結果為先對a[i]賦值i,然後操作i++。此類代碼一定要小心。如果你在做code review發現++ –出現在其它運算式中或者作為參數出現,一定要立刻馬上把它移出來作為單獨語句,小心駛得萬年船。

6)sizeof

sizeof(x), x可以是一個運算式或者類型名,如果是運算式,不做運算,int x = 1; size_t sz = sizeof(x++); X不會增加。T *p = NULL; p = malloc(sizeof *p); p並沒有提領,K&R聖書也有講。

sizeof unary-expr; sizeof(typename);一元運算式可以沒有括弧,聖書裡面文法部分提到。如size_t f = sizeof 99;

7)宏定義要小心

例如:#define FOO(a,b) (a+b)/(1-a)如果這樣調用FOO(bar++,4),自增兩次,當然,把宏展開就非常清楚了。

參考資料:

http://www.steike.com/code/useless/evil-c/

《C陷阱與缺陷》

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.