有同學(xué)寫過或者想寫這樣的宏定義嗎?
求兩個(gè)或幾個(gè)數(shù)的乘積:?? #define SQU(x) x*x
我們正常使用沒有問題:
但如果這樣寫呢?
哎呀,竟然不是100了,難道SQU(10)和SQU(5+5)不等價(jià)嗎?5+5不是10嗎?
的確,這里SQU(10)和SQU(5+5)的確不等價(jià)!
原因在于,宏定義的本質(zhì)是文本替換!所以在預(yù)處理期間SQU(5+5)這段代碼被宏替換為5+5*5+5,結(jié)果因?yàn)槌朔▋?yōu)先級高于加法,變成5+25+5,可想而知!
那么解決這個(gè)問題的辦法,相信大家看完之后心里應(yīng)該有答案了,就是給x加個(gè)小括號,使它變成一個(gè)整體,如下:
就可以解決了。
然而,這并不沒有完!
與此類似的,當(dāng)我們想算兩個(gè)數(shù)的和的時(shí)候呢?我們繼續(xù)驗(yàn)證:
正常寫,不會(huì)觸發(fā)陷阱,關(guān)鍵沒錯(cuò)并不代表沒有問題(雖然每個(gè)x都加了小括號!)
大家試試這樣寫:
艾瑪! 為嘛不是20*20的400呢?
還是遵循宏的本質(zhì),我們展開來看:10+10*10+10=120
又是一個(gè)優(yōu)先級問題,又一個(gè)陷阱,防不勝防呀!
那怎么解決呢?答:干脆一了百了,整體全加括號吧!
這么寫:#define ADD(x) ((x)+(x))
怎么樣,這樣寫就沒問題了!你的宏,從此百毒不侵!
有什么學(xué)習(xí)中遇到的問題,請聯(lián)系我們!
C語言研究中心(www.sztianhecheng.cn)