問題21:判斷C編譯器是否支援嵌套注釋。
解法:嵌套注釋是指在/* */ 中出現/* ... */,定義這個式子: /*/*/0*/**/1 。如果編譯器不支援嵌套注釋,那麼這個式子為0*1。如果支援嵌套注釋,那麼這個式子為1。摘自《C陷阱與缺陷》。
問題22:判斷機器的大小端。
解法:用聯合,先將其中的word賦值為0x12345678,然後列印數組bytes的元素。如果是大端,列印結果為12, 34, 56, 78;如果是小端,列印結果為78,56,34 ,12。
union endian{unsigned int word;unsigned char bytes[4];};
問題23:用宏實現max的一個版本,其中max的參數都是整數,要求在宏max的定義中這些整型參數只被求值一次。
解法:一般的我們會寫成這樣:
#define max(a,b) ((a)>(b)? (a): (b))
但是這樣存在問題,如果a是i++,那麼上述宏展開後為 ((i++)>b)? (i++): (b)),i 可能會被加兩次。如何避免這種情況呢?這是本題的關鍵。
其實如果能用內聯,寫成內嵌函式是最好的。如果非要用宏,那麼需要引入中間變數。如下定義:
static int tmp1,tmp2; #define max(a,b) (tmp1=(a),tmp2=(b),tmp1>tmp2? tmp1: tmp2)
問題24:數組與指標的區別。
解答:摘自《C專家編程》。
(1)數組:儲存資料;指標:儲存資料的地址。
(2)數組:直接存取資料;指標:間接訪問資料,首先取得指標的內容,把它作為地址,然後從地址提取資料
(3)數組:通常用於儲存固定數目前資料類型相同的元素;指標:通常用於動態資料結構
(4)數組:隱式分配和刪除;指標:相關的函數為malloc(),free()。
(5)數組:自身即為資料名;指標,通常指向匿名資料。
問題25:這個運算式能成為合法的C運算式嗎?(x) ((x)-1)。
解答:這個運算式看似奇怪,其實也是可能的。假如之前有下面定義: typedef x int,那麼這個運算式等價與 (int) ((int)-1)。即將-1轉為int類型兩次。