当前位置: 代码迷 >> C语言 >> 关于“编译预处理和动态存储分配”的一个小小问题
  详细解决方案

关于“编译预处理和动态存储分配”的一个小小问题

热度:210   发布时间:2008-03-12 19:45:51.0
关于“编译预处理和动态存储分配”的一个小小问题
#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了吗
本帖最近评分记录
  • wcghappy +2 真是太谢谢您了~! 您真是一个好版主~! ... 2008-3-13 15:45
  • qfyzy +3 说的很详细了,希望能写一章关于宏的 ... 2008-3-12 20:21

女施主``我给你``送茶来了```师太``你就从了老衲吧``
代码本天成~~~妙头偶得之```
2008-03-12 12:18:32
xianshizhe111

等 级:新手上路
帖 子:1451
专家分:0
注 册:2007-12-8
  得分:0 
#include<stdio.h>
#define MIN(x,y) (x)<(y)?(x):(y)
main()
{
    int i,j,k;
    i=10;
    j=15;
    /*k=1*MIN(i,j);*/
    k=10*(i)<(j)?(i):(j);
    printf("%d\n",k);
}
----------------解决方案--------------------------------------------------------
C说得对啊,你把那个符号出现的地方直接换成宏定义里面的表达式,直接哦,不加多余的括号,你看看就知道了。
----------------解决方案--------------------------------------------------------
  相关解决方案