??在面試或者筆試中,經(jīng)常會碰到“用一個宏實現(xiàn)求兩個數(shù)中的最大數(shù)”這個題目,大家看到這個問題,覺得很容易實現(xiàn),認為這有什么難度呢,隨手就是一個:
#define MAX(x, y) ((x) > (y) ? (x) : (y))
注:用括號將宏定義整個括起來,在任何時候,都是一個好習慣。
??如果能寫出上邊這個宏,你這道題的考試就能交差了,然后覺得對自己來說就是隨手一寫的事兒,那可就大錯特錯了。因為以上寫法的宏定義,雖然也能拿到分數(shù),但是在面試者或者筆試閱卷者看來,你也不過如此,你也只是茫茫人海中平凡的一員。那么對于這道平淡無奇的題目來說,如何給考官一個眼前一亮,豁然開朗的印象,可以嘗試下使用下邊幾種方法來實現(xiàn)。
??上邊那個宏定義,一般情況下,是可以滿足需求的,但是對于一些參數(shù)具有副作用的情況,就很容易出現(xiàn)意想不到的結(jié)果了。比如:
int a = 1;int b = 10;int max = MAX(a , b );// 宏定義展開:((a ) > (b ) ? (a ) : (b ));
??以上例子,結(jié)果會根據(jù)編譯器的差異,產(chǎn)生一些意外的結(jié)果,這些絕對不會是程序開發(fā)者想要的結(jié)果,自己可以思考下...
??為了防止宏定義的兩個參數(shù)存在副作用的情況,可以將傳遞給宏定義的參數(shù),在對比之前,保留一份備份,用備份參數(shù)來進行對比,總不會錯了吧,并且這樣實現(xiàn),參數(shù)的副作用僅計算一次,不會影響對比的結(jié)果,實現(xiàn)方式如下MAX_2:
#define MAX_2(x, y) ({ int _x = (x); int _y = (y); _x > _y ? _x : _y; })
??然而,很快就發(fā)現(xiàn),以上MAX_2宏定義,僅僅是用在對比兩個int型參數(shù)時,實際情況可能對比的是unsigned char,或者其他的類型,那么這個宏定義也不能很好地實現(xiàn)預期效果。
??繼續(xù)改進,將要對比的參數(shù)類型以一個參數(shù)的形式傳遞給宏定義,比如下面MAX_3:
#define MAX_3(type, x, y) ({ type _x = (x); type _y = (y); _x > _y ? _x : _y; })
??這樣,宏定義要對比的兩個參數(shù)的參數(shù)類型,以參數(shù)的形式傳遞給宏定義,在宏定義中,type參數(shù),將是宏定義中傳遞的那個參數(shù)類型,使用方法如下:
unsigned char c = 'A';unsigned char d = 'B'MAX_3(unsigned char, c, d);
??MAX_3宏定義,很好地實現(xiàn)了對于不同類型的兩個參數(shù)求最大值的功能,但是先不要太高興,因為MAX_3還是存在些缺點的,比如,對于一些粗心大意,導致傳遞的兩個參數(shù),存在和第一個參數(shù)類型不一致的情況,如下:
int a = 100;unsigned char c = 'H';MAX_3(unsigned char, a, c);
??以上情況,可能只是手誤,但是這個意外確實存在了,而MAX_3宏定義也確實會正常執(zhí)行,但是結(jié)果可能就不是實現(xiàn)者的本意,而在代碼中也很難被查出來,大家應該都有花費大量時間查Bug,最后發(fā)現(xiàn)是一個小符號錯誤的情況,太無奈,不再多說...
??以上情況,也是有方法的,比如下面這個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關(guān)鍵字,來獲取參數(shù)的類型,并保存參數(shù)的一份拷貝,防止參數(shù)副作用影響對比結(jié)果,再通過(void)(&_x == &_y);來對比兩個參數(shù)類型,如果不是同一種類型,在編譯階段就會報出warning,引起開發(fā)者注意,提前消滅隱患。
??經(jīng)過以上幾種寫法的對比,會發(fā)現(xiàn)最后一種MAX_4宏定義的使用還是很安全的。如果應試者能夠在筆試中很快地寫出MAX_4宏定義的實現(xiàn)方式,我相信絕對會給考官們眼前一亮,甚至是驚艷的效果。
??如果以上四種方式都達不到你需要的效果,那么我也沒辦法了,因為MAX_4宏定義可以說是我的認知范圍內(nèi),最安全的實現(xiàn)“宏定義求兩個數(shù)中的最大值”的方法了。隨時歡迎朋友們分享更好的實現(xiàn)方法來學習。