下面列出的特性未必奇怪,有的算是有趣。
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陷阱與缺陷》