#include <stdio.h>
#define min(x,y) (x)<(y)?(x):(y)
main()
{
int i=10,j=15,k=10;
k=10*min(i,j);
printf("%d",k);
}
如题,k怎么变成15,应该是10*10啊~~~
///
上面的宏定义少一个最外层的括号,这句k=10*min(i,j)其实相当于:k=10*(10)<(15)?(10):(15),这时当然返回值就是15了.因为100<15不成立,所以会返回后面那个值.
知识点:宏定义只是一个简单的字符串替换
/
k=10*min(i,j);
上面这一句被宏替代后变成
k=10*(i)<(j)?(i):(j);
也就是100和15中取最小的
当然是15
#define min(x,y) (x)<(y)?(x):(y)
要加大括号
#define min(x,y) ((x)<(y)?(x):(y))
不然 k=10*min(i,j);
为k=10*(i)<(j)?(i):(j);
define 是不加处理的直接替换
///
宏只是简单替换,不能理解为函数啊...
简单的把宏值替换宏名就可以看出结果了.
define默认的是min(x,y)
不认得i,j的
应该用:
min(x,y){}
/
这是运算符优先级的问题
k=10*min(i,j)中,编译器将宏min展开变成
k=10*i<j?i:j;
由于*的优先级大于<,所以结果是 10*10<15?100:15
所以答案是15