大家好,我是軒哥。
今天我們通過一個(gè) C語言中的宏定義來看一看,不同段位的程序員都是怎么樣來寫代碼的。這個(gè)宏定義是我在面試過程中習(xí)慣性使用的第一個(gè)問題,然而很多面試者的回答都停留在了比較初級的寫法上,至少說明經(jīng)驗(yàn)尚淺,踩的坑太少啊。
我們先來看一下題目:請定義一個(gè)宏函數(shù),函數(shù)的功能是返回兩個(gè)參數(shù)中較大的值。
青銅寫法:
#define MAX (x,y) x > y? x: y
這是遇到的最多的寫法,對于這個(gè)答案,我想學(xué)過譚浩強(qiáng)版 C語言的程序員大概都能閉著眼寫出來。測試一下:?
#define MAX (x,y) x > y? x: y
int result = MAX(1!= 1,1!= 2);
按照宏定義規(guī)則,在編譯器進(jìn)行展開后,可以考慮一下,表達(dá)式是不是就亂掉了?你不知道使用者傳進(jìn)來的是個(gè)數(shù)還是表達(dá)式,所以有必要改進(jìn)一下。
白銀答案:
#define MAX(x,y) (x) > (y)? (x): (y)
這個(gè)答案還是中規(guī)中矩的,一般有個(gè)兩三年編碼經(jīng)驗(yàn)的人都應(yīng)該寫出這樣的答案,否則我認(rèn)為你可能連 ctrl + c 和 ctrl + v 還沒整熟練。
不過還是有些情況下調(diào)用會產(chǎn)生意想不到的效果,因?yàn)楦邇?yōu)先級的運(yùn)算符會闖進(jìn)來哦。
測試一下:
#define MAX(x,y) (x) > (y)? (x) : (y)
int result = 3 + MAX(1,2);
上面的調(diào)用在編譯前展開后為:
int?result?=?3?+?(1)?>?(2)???(1)?:?(2)?
所以,我們有必要去查一查?運(yùn)算符 “+” 、?“>” 以及?“?:” 哪個(gè)優(yōu)先級更高一些了。
可以看到,加減乘除的運(yùn)算優(yōu)先級是遙遙領(lǐng)先的。
黃金答案:
#define MAX(x,y) ((x) > (y) ? (x) : (y))
嗯,為了避免運(yùn)算符的問題,我們再加一層括號,碼程序不是耍技巧,拿不準(zhǔn)的情況下,我多加括號就可以了。我們再測試一下:
#define MAX(x,y) ((x) > (y) ? (x) : (y))
int?result = 3?+?MAX(i++,j++);?
上面的調(diào)用案例是不是讓你反應(yīng)過來了,這里面的 i++是被直接展開的,因此在我們的代碼里實(shí)際上是被調(diào)用了兩次哦!
int?result?=?3?+?((i++) > (j++) ? (i++) : (j++));
這樣你計(jì)算出的結(jié)果總是大一點(diǎn)
鉑金答案:
#define?MAX(x,y)?({???? ?
int?_x?=?x;????
????int?_y?=?y;???????? ?
????_x?>?_y???_x?:?_y;? ?
})?
好,既然你輸入的參數(shù)能變換莫測,我就定義一個(gè)變量把他先放寄存器里,中間不讓你再打擾我,全處理完我再返回給你。
新來個(gè)搞算法的程序員,調(diào)用測試一下吧
MAX(3.65,3.68);
賦值錯誤!,你這函數(shù)寫的兼容性也太差了,到底支持什么樣的類型也沒說清楚,我以為是萬能的呢
鉆石答案:
#define MAX(type, x, y) ({
????type?_x?=?x;??????????????
type?_y?=?y;??????????????
????_x?>?_y???_x?:?_y;????????
})
老子成全你,我把類型也搞成個(gè)參數(shù),你自己定某天公司來了個(gè) Python 程序員一起 review 代碼邏輯。這是什么鬼。。。。。。