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