加入星計(jì)劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴(kuò)散
  • 作品版權(quán)保護(hù)
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長期合作伙伴
立即加入
  • 正文
    • 青銅寫法:
    • 白銀答案:
    • 黃金答案:
    • 鉑金答案:
    • 鉆石答案:
  • 推薦器件
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請入駐 產(chǎn)業(yè)圖譜

一個(gè)宏定義看看你的 C語言級別

2023/09/25
2366
閱讀需 5 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

大家好,我是軒哥。

今天我們通過一個(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 代碼邏輯。這是什么鬼。。。。。。

推薦器件

更多器件
器件型號 數(shù)量 器件廠商 器件描述 數(shù)據(jù)手冊 ECAD模型 風(fēng)險(xiǎn)等級 參考價(jià)格 更多信息
IHLP2525CZER6R8M01 1 Vishay Intertechnologies General Fixed Inductor, 1 ELEMENT, 6.8 uH, COMPOSITE-CORE, GENERAL PURPOSE INDUCTOR, SMD, CHIP, 2525, GREEN

ECAD模型

下載ECAD模型
$1.34 查看
BSS123-7-F 1 Diodes Incorporated Small Signal Field-Effect Transistor, 0.17A I(D), 100V, 1-Element, N-Channel, Silicon, Metal-oxide Semiconductor FET, GREEN, PLASTIC PACKAGE-3

ECAD模型

下載ECAD模型
$0.3 查看
9-160313-2 1 TE Connectivity (9-160313-2) 250 PIDG FASTON REC

ECAD模型

下載ECAD模型
$0.52 查看

相關(guān)推薦

電子產(chǎn)業(yè)圖譜

多年硬件從業(yè)經(jīng)驗(yàn),專注分享從研發(fā)到供應(yīng)鏈,再到精益制造過程中的經(jīng)驗(yàn)和感悟!