奇怪的C語(yǔ)言特性
下面列出的特性未必奇怪,有的算是有趣。
1)a[2] 等價(jià)于 2[a]
"aabbccdd"[5] 等價(jià)于 5["aabbccdd"]
這條特性可以用于使用數(shù)組、指針、字符串,但不能用在變量定義時(shí)。K&R C Programming language 217頁(yè)對(duì)此有介紹。
2)二元、三元復(fù)合字符
http://en.wikipedia.org/wiki/Digraphs_and_trigraphs
字符串字面值??!將被認(rèn)為是|,所以兩個(gè)問(wèn)號(hào)同時(shí)出現(xiàn)在字符串的時(shí)候一定要小心。二元復(fù)合字符在C99被引入,如<:等價(jià)于[
3)Duff's Device
http://en.wikipedia.org/wiki/Duff%27s_device
特點(diǎn)是switch與while交錯(cuò)出現(xiàn)。代碼類似
4)同名同姓現(xiàn)象
在《C陷阱與缺陷》中有詳細(xì)解釋。
5)a[i++]= i;
這個(gè)好像是依賴特定編譯器實(shí)現(xiàn),我在Xcode實(shí)驗(yàn)結(jié)果為先對(duì)a[i]賦值i,然后操作i++。此類代碼一定要小心。如果你在做code review發(fā)現(xiàn)++ –出現(xiàn)在其它表達(dá)式中或者作為參數(shù)出現(xiàn),一定要立刻馬上把它移出來(lái)作為單獨(dú)語(yǔ)句,小心駛得萬(wàn)年船。
6)sizeof
sizeof(x), x可以是一個(gè)表達(dá)式或者類型名,如果是表達(dá)式,不做運(yùn)算,int x = 1; size_t sz = sizeof(x++); X不會(huì)增加。T *p = NULL; p = malloc(sizeof *p); p并沒(méi)有提領(lǐng),K&R圣書也有講。
sizeof unary-expr; sizeof(typename);一元表達(dá)式可以沒(méi)有括號(hào),圣書里面語(yǔ)法部分提到。如size_t f = sizeof 99;
7)宏定義要小心
例如:#define FOO(a,b) (a+b)/(1-a)如果這樣調(diào)用FOO(bar++,4),自增兩次,當(dāng)然,把宏展開(kāi)就非常清楚了。
參考資料:
http://www.steike.com/code/useless/evil-c/
《C陷阱與缺陷》
相關(guān)文章
C語(yǔ)言中通用工具庫(kù)stdlib.h的一些常用函數(shù)
這篇文章主要給大家介紹了關(guān)于C語(yǔ)言中通用工具庫(kù)stdlib.h的一些常用函數(shù),stdlib.h頭文件包含了許多C標(biāo)準(zhǔn)庫(kù)函數(shù)的原型聲明和宏定義,這些函數(shù)主要與動(dòng)態(tài)內(nèi)存分配、隨機(jī)數(shù)生成、進(jìn)程控制、字符串轉(zhuǎn)換等相關(guān),需要的朋友可以參考下2024-01-01C++ STL入門教程(2) list雙向鏈表使用方法(附程序代碼)
這篇文章主要為大家詳細(xì)介紹了C++ STL入門教程第二篇,list雙向鏈表使用方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08純C語(yǔ)言實(shí)現(xiàn)火車售票系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了純C語(yǔ)言實(shí)現(xiàn)火車售票系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-12-12C++ 中boost::share_ptr智能指針的使用方法
這篇文章主要介紹了C++ 中boost::share_ptr智能指針的使用方法的相關(guān)資料,希望通過(guò)本文能幫助到大家,需要的朋友可以參考下2017-10-10VC++獲得當(dāng)前進(jìn)程運(yùn)行目錄的方法
這篇文章主要介紹了VC++獲得當(dāng)前進(jìn)程運(yùn)行目錄的方法,可通過(guò)系統(tǒng)函數(shù)實(shí)現(xiàn)該功能,是非常實(shí)用的技巧,需要的朋友可以參考下2014-10-10