#define宏加括号和不加括号的区别
生活随笔
收集整理的這篇文章主要介紹了
#define宏加括号和不加括号的区别
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
#define 宏是在代碼中不加任何驗證的直接替代,當(dāng)宏中包含運算符時要在最外層加括號,不然可能會出錯
下面使用一個簡單的例子來驗證一下,代碼中定義一個求兩個數(shù)中最大數(shù)的宏:
MAX_wrong在外層沒有加括號,MAX_right在外層加了括號
#include<stdlib.h> #include<stdio.h>#define MAX_wrong(x,y) x>y?x:y #define MAX_right(x,y) (x>y?x:y)int main() {int x, y;scanf("x=%d y=%d", &x, &y);//下面這行等價于 int a = x>y?x:y*6int a = MAX_wrong(x,y) * 6; //下面這行等價于 int a = (x>y?x:y)*6 int b = MAX_right(x,y) * 6;/*下面這行輸出的兩個結(jié)果是一樣的*/printf("%d %d\n", MAX_wrong(x,y), MAX_right(x,y));/*當(dāng)x>y時,a和b值不一樣,當(dāng)x<=y時,a和b的值一樣*/printf("%d %d\n", a, b);return 0; }經(jīng)過下面兩個測試用例,發(fā)現(xiàn)不管定義宏時外層加沒加括號,宏MAX_wrong和宏MAX_right的值都是一樣的,沒有問題。
但是要對宏進行運算時出現(xiàn)了問題,下面第一個的測試結(jié)果中,a和b的值碰巧一樣;但是第二個測試結(jié)果中a和b的值不同,b是我們想要的值,a的值和預(yù)想中不一樣。
分析其原因:
int a = MAX_wrong(x,y) * 6; 這句話實際相當(dāng)于?int a = x>y?x:y* 6;??
x>y?x:y* 6??的意思是如果x>y則返回x,否則返回冒號后面的值y*6
而int b?= MAX_right(x,y) * 6; 這句話實際相當(dāng)于?int a = (x>y?x:y) * 6;??
括號的優(yōu)先級要高于*,所以會先計算x>y?x:y的值,再進行*6,與我們想要的一樣。
完畢!
總結(jié)
以上是生活随笔為你收集整理的#define宏加括号和不加括号的区别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: matlab定义域为全体实数画图,MAT
- 下一篇: 数学建模小白必备手册