关于“编译预处理和动态存储分配”的一个小小问题
#include<stdio.h>
#define MIN(x,y) (x)<(y)?(x):(y)
main()
{
int i,j,k;
i=10;
j=15;
k=10*MIN(i,j);
printf("%d\n",k);
}
这个值为什么是15呢?
看看我算的哪里不对呗?
我的思路:宏定义里面的x与y被赋值成了10和15.
然后进行比较,判断x与y的大小,如果x<y成立,则输出x的值。
然后在通过公式:k=10*MIN(i,j) k=10*15=150 答案就是150 不对啊~~! 为什么是15呢?
----------------解决方案--------------------------------------------------------
宏扩展了嘛。。。
10*10<15会先计算,100当然不小于15了
[[it] 本帖最后由 qfyzy 于 2008-3-12 19:51 编辑 [/it]]
----------------解决方案--------------------------------------------------------
具体一下呗 初学者不是很明白的
----------------解决方案--------------------------------------------------------
k=300-50*100*MIN(i,j);/*我想应这样理解,加前面任意项,把它当成逗号表达式运算*/
不行不太正确.
[[it] 本帖最后由 xianshizhe111 于 2008-3-12 20:01 编辑 [/it]]
----------------解决方案--------------------------------------------------------
还是不明白,具体点吧~
就是k到底等于什么?
----------------解决方案--------------------------------------------------------
这个还的好好研究,研究宏.
----------------解决方案--------------------------------------------------------
#include<stdio.h>
#define MIN(x,y) (x)<(y)?(x):(y)
main()
{
int i,j,k;
i=10;
j=15;
k=10*(MIN(i,j));
printf("%d\n",k);
}
看来2楼说的有道理,这样加个括号就行了。
----------------解决方案--------------------------------------------------------
我把它扩展一下:
开始:
#define MIN(x,y) (x)<(y)?(x):(y)
k=10*MIN(i,j);
第一步:
#define MIN(i,j) (i)<(j)?(i):(j)
k=10*MIN(i,j);
第三步:
#define MIN(10,15) (10)<(15)?(10):(15)
k=10*MIN(10,15);
第四步:
k=10*(10)<(15)?(10):(15) ;
第五步:
k = (10*10) < (15) ? (10) : (15) ;
现在知道为什么是15了吗