#define定義宏函數 的正確使用


如何使用宏來定義一個自定義函數呢?
首先我們來看下面這段代碼

#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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM