如何使用宏來定義一個自定義函數呢?
首先我們來看下面這段代碼
#define SQUARE(x) x*x int main() { int a = 5; printf("SQUARE(a): %d\n",SQUARE(a)); //這個值為25 printf("SQUARE(a+1): %d\n", SQUARE(a + 1)); //第一反應是打印36,其實打印的是11 }
運行結果:
為什么會出現這樣的結果呢?原因是編譯器在處理SQUARE(a+1)的時候,處理成了 a+1a+1 ,所以a = 5時,最后結果為 11,當我們的宏定義為 #define SQUARE(x) xx 時,結果就是36,那這種宏的定義方法是正確的嗎?
再看看下面這段代碼:
#define MAX(a,b) (a>b?a:b) int main() { int a = 5; int b = 3; printf("MAX(a, b): %d\n", MAX(a, b)); //很明顯,打印的是5. printf("MAX(a&1, b&1): %d\n", MAX(a&1, b&)); //這里打印的是5嗎? }
運行結果如下:
那這又是怎么回事呢?原因是編譯器將 MAX(a&1, b&1) 處理為 a&1>b&1?a&1:b&1 ,這里就要考慮運算符的優先級問題了。這篇博客介紹了C語言運算符優先級 。
所以我們可以看到>的優先級高於&,所以運算過程如下圖:
總結:宏函數的正確寫法是 每一個元素加括號,並且在最外層也加括號,如#define MAX(a,b) ((a)>(b)?(a):(b?).
僅為個人理解,如有錯誤請指出!
---------------------
作者:故淵~
來源:CSDN
原文:https://blog.csdn.net/lvxin15353715790/article/details/87891991
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!
參考鏈接:
詳解宏定義(#define)【轉】 - biqioso的博客 - CSDN博客 https://blog.csdn.net/biqioso/article/details/80420152