用一個宏實現求兩個數中的最大數

用一個宏實現求兩個數中的最大數

最多見的實現方法

  在面試或者筆試中,常常會碰到「用一個宏實現求兩個數中的最大數」這個題目,你們看到這個問題,以爲很容易實現,認爲這有什麼難度呢,隨手就是一個:面試

#define MAX(x, y) \
        ((x) > (y) ? (x) : (y))

注:用括號將宏定義整個括起來,在任什麼時候候,都是一個好習慣。
  若是能寫出上邊這個宏,你這道題的考試就能交差了,而後以爲對本身來講就是隨手一寫的事兒,那可就大錯特錯了。由於以上寫法的宏定義,雖然也能拿到分數,可是在面試者或者筆試閱卷者看來,你也不過如此,你也只是茫茫人海中平凡的一員。那麼對於這道平淡無奇的題目來講,如何給考官一個眼前一亮,豁然開朗的印象,能夠嘗試下使用下邊幾種方法來實現。安全

  上邊那個宏定義,通常狀況下,是能夠知足需求的,可是對於一些參數具備反作用的狀況,就很容易出現意想不到的結果了。好比:學習

int a = 1;
int b = 10;
int max = MAX(a++, b++);
// 宏定義展開:
((a++) > (b++) ? (a++) : (b++));

  以上例子,結果會根據編譯器的差別,產生一些意外的結果,這些絕對不會是程序開發者想要的結果,本身能夠思考下...code

防止參數反作用的實現方法

  爲了防止宏定義的兩個參數存在反作用的狀況,能夠將傳遞給宏定義的參數,在對比以前,保留一份備份,用備份參數來進行對比,總不會錯了吧,而且這樣實現,參數的反作用僅計算一次,不會影響對比的結果,實現方式以下MAX_2:開發

#define MAX_2(x, y) ({\
        int _x = (x); \
        int _y = (y); \
        _x > _y ? _x : _y; \
})

  然而,很快就發現,以上MAX_2宏定義,僅僅是用在對比兩個int型參數時,實際狀況可能對比的是unsigned char,或者其餘的類型,那麼這個宏定義也不能很好地實現預期效果。編譯器

指定參數類型的實現方法

  繼續改進,將要對比的參數類型以一個參數的形式傳遞給宏定義,好比下面MAX_3:編譯

#define MAX_3(type, x, y) ({\
        type _x = (x); \
        type _y = (y); \
        _x > _y ? _x : _y; \
})

  這樣,宏定義要對比的兩個參數的參數類型,以參數的形式傳遞給宏定義,在宏定義中,type參數,將是宏定義中傳遞的那個參數類型,使用方法以下:程序

unsigned char c = 'A';
unsigned char d = 'B'

MAX_3(unsigned char, c, d);

  MAX_3宏定義,很好地實現了對於不一樣類型的兩個參數求最大值的功能,可是先不要過高興,由於MAX_3仍是存在些缺點的,好比,對於一些粗枝大葉,致使傳遞的兩個參數,存在和第一個參數類型不一致的狀況,以下:方法

int a = 100;
unsigned char c = 'H';

MAX_3(unsigned char, a, c);

  以上狀況,可能只是手誤,可是這個意外確實存在了,而MAX_3宏定義也確實會正常執行,可是結果可能就不是實現者的本意,而在代碼中也很難被查出來,你們應該都有花費大量時間查Bug,最後發現是一個小符號錯誤的狀況,太無奈,再也不多說...總結

相對最安全的實現方法

  以上狀況,也是有方法的,好比下面這個MAX_4宏定義:

#define MAX_4(x, y) ({\
        typeof(x) _x = (x); \
        typeof(y) _y = (y); \
        (void)(&_x == &_y); \
        _x > _y ? _x : _y; \
})

  MAX_4宏定義,經過typeof關鍵字,來獲取參數的類型,並保存參數的一份拷貝,防止參數反作用影響對比結果,再經過(void)(&_x == &_y);來對比兩個參數類型,若是不是同一種類型,在編譯階段就會報出warning,引發開發者注意,提早消滅隱患。

總結

  通過以上幾種寫法的對比,會發現最後一種MAX_4宏定義的使用仍是很安全的。若是應試者可以在筆試中很快地寫出MAX_4宏定義的實現方式,我相信絕對會給考官們眼前一亮,甚至是驚豔的效果。   若是以上四種方式都達不到你須要的效果,那麼我也沒辦法了,由於MAX_4宏定義能夠說是個人認知範圍內,最安全的實現「宏定義求兩個數中的最大值」的方法了。隨時歡迎朋友們分享更好的實現方法來學習。

相關文章
相關標籤/搜索