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