用乙個巨集實現求兩個數中的最大數

2022-05-21 17:18:11 字數 1848 閱讀 8510

#define max(x, y) \

((x) > (y) ? (x) : (y))

注:用括號將巨集定義整個括起來,在任何時候,都是乙個好習慣。

如果能寫出上邊這個巨集,你這道題的考試就能交差了,然後覺得對自己來說就是隨手一寫的事兒,那可就大錯特錯了。因為以上寫法的巨集定義,雖然也能拿到分數,但是在面試者或者筆試閱卷者看來,你也不過如此,你也只是茫茫人海中平凡的一員。那麼對於這道平淡無奇的題目來說,如何給考官乙個眼前一亮,豁然開朗的印象,可以嘗試下使用下邊幾種方法來實現。

上邊那個巨集定義,一般情況下,是可以滿足需求的,但是對於一些引數具有***的情況,就很容易出現意想不到的結果了。比如:

int a = 1;

int b = 10;

int max = max(a++, b++);

// 巨集定義展開:

((a++) > (b++) ? (a++) : (b++));

以上例子,結果會根據編譯器的差異,產生一些意外的結果,這些絕對不會是程式開發者想要的結果,自己可以思考下...

為了防止巨集定義的兩個引數存在***的情況,可以將傳遞給巨集定義的引數,在對比之前,保留乙份備份,用備份引數來進行對比,總不會錯了吧,並且這樣實現,引數的***僅計算一次,不會影響對比的結果,實現方式如下max_2:

#define max_2(x, y) ()
然而,很快就發現,以上max_2巨集定義,僅僅是用在對比兩個int型引數時,實際情況可能對比的是unsigned char,或者其他的型別,那麼這個巨集定義也不能很好地實現預期效果。

繼續改進,將要對比的引數型別以乙個引數的形式傳遞給巨集定義,比如下面max_3:

#define max_3(type, 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) ()
max_4巨集定義,通過typeof關鍵字,來獲取引數的型別,並儲存引數的乙份拷貝,防止引數***影響對比結果,再通過(void)(&_x == &_y);來對比兩個引數型別,如果不是同一種型別,在編譯階段就會報出warning,引起開發者注意,提前消滅隱患。

經過以上幾種寫法的對比,會發現最後一種max_4巨集定義的使用還是很安全的。如果應試者能夠在筆試中很快地寫出max_4巨集定義的實現方式,我相信絕對會給考官們眼前一亮,甚至是驚豔的效果。

如果以上四種方式都達不到你需要的效果,那麼我也沒辦法了,因為max_4巨集定義可以說是我的認知範圍內,最安全的實現「巨集定義求兩個數中的最大值」的方法了。隨時歡迎朋友們分享更好的實現方法來學習。

用兩個棧實現乙個佇列 用兩個佇列實現乙個棧

做題之前,我們先來回顧一下 棧和佇列的相同點以及不同點 便於做題時的應用!1.區別與聯絡 相同點 1 棧和佇列都是控制訪問點的線性表 2 棧和佇列都是允許在端點處進行資料的插入和刪除的資料結構 不同點 1 棧遵循 後進先出 lifo 的原則,即只能在該線性表的一頭進行資料的插入和刪除,該位置稱為 棧...

用兩個棧實現乙個佇列,用兩個佇列實現乙個棧

t deletehead 頭部刪除節點 while s1.empty t ret s2.top s2.pop return ret private stacks1 stacks2 問題2 用兩個佇列實現乙個棧 問題分析 用兩個佇列實現乙個棧,刪除時,由於佇列是先進先出的,而棧是後進先出,因此假設現在...

用兩個棧實現乙個佇列 用兩個佇列實現乙個棧

思路 棧 先進後出,佇列 先進先出 如果轉化 1.將內容先push進乙個棧instack,2.判斷outstack是否為空,空 將棧instack中的元素pop 刪除並返回陣列的最後乙個元素 並push進outstack,非空 直接出棧 3.出棧時,先push進instack先從outstack出來...