免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
一個宏實現(xiàn)
 

用一個宏實現(xiàn)求兩個數(shù)中的最大數(shù)

最常見的實現(xiàn)方法

??在面試或者筆試中,經(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ù)副作用的實現(xiàn)方法

??為了防止宏定義的兩個參數(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)預期效果。

指定參數(shù)類型的實現(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)是一個小符號錯誤的情況,太無奈,不再多說...

相對最安全的實現(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ā)者注意,提前消滅隱患。

總結(jié)

??經(jīng)過以上幾種寫法的對比,會發(fā)現(xiàn)最后一種MAX_4宏定義的使用還是很安全的。如果應試者能夠在筆試中很快地寫出MAX_4宏定義的實現(xiàn)方式,我相信絕對會給考官們眼前一亮,甚至是驚艷的效果。
??如果以上四種方式都達不到你需要的效果,那么我也沒辦法了,因為MAX_4宏定義可以說是我的認知范圍內(nèi),最安全的實現(xiàn)“宏定義求兩個數(shù)中的最大值”的方法了。隨時歡迎朋友們分享更好的實現(xiàn)方法來學習。

來源:https://www.icode9.com/content-4-305851.html
本站僅提供存儲服務,所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
【C語言筆記】如何查看數(shù)據(jù)類型范圍?
單片機C語言學習
struct結(jié)構(gòu)體的初始化及typedef的理解總結(jié)
Linux C 基本數(shù)據(jù)結(jié)構(gòu)與優(yōu)先級
C語言學習經(jīng)驗總結(jié)
list_entry的宏定義
更多類似文章 >>
生活服務
分享 收藏 導長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服