寫一個標准宏MIN,輸入兩個參數,返回較小的


#define MIN(A,B) ((A) <= (B) ? (A) : (B))
MIN(*p++, b)會產生宏的副作用

剖析:

這個面試題主要考查面試者對宏定義的使用,宏定義可以實現類似於函數的功能,但是它終歸不是函數,而宏定義中括弧中的“參數”也不是真的參數,在宏展開的時候對“參數”進行的是一對一的替換。程序員對宏定義的使用要非常小心,特別要注意兩個問題:

(1) 謹慎地將宏定義中的“參數”和整個宏用用括弧括起來。所以,嚴格地講,下述解答:

#define MIN(A,B) (A) <= (B) ? (A) : (B)
#define MIN(A,B) (A <= B ? A : B )都應判0分;

(2) 防止宏的副作用。

  宏定義#define MIN(A,B) ((A) <= (B) ? (A) : (B))對MIN(*p++, b)的作用結果是:((*p++) <= (b) ? (*p++) : (b)) 這個表達式會產生副作用,指針p會作兩次++自增操作。除此之外,另一個應該判0分的解答是:#define MIN(A,B) ((A) <= (B) ? (A) : (B));
這個解答在宏定義的后面加“;”,顯示編寫者對宏的概念模糊不清,只能被無情地判0分並被面試官淘汰。

正確的解法:

  1. #define MIN(a,b) ((a)>=(b)?(b):(a))  


但是:

MIN(*p++,b)會產生副作用。

((*p++)>=(b)?(b):(*p++))這個表達式會使得指針p作2次自增操作。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM