C语言问题:这个值不是100么,怎么变成15

#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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值