QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 776|回复: 9

两个c语言问题

[复制链接]
发表于 2003-7-3 16:24:30 | 显示全部楼层 |阅读模式
我刚学c,遇到几个问题,百思不得其解:
#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,而不是100? 把i,j代入x,y,10<15?10:15,结果应该是10吧,那么k=10*10,不就是100了吗?为何答案是15?

#define spr(x) x*x
main()
{ int a,k=2,m=1;
  a/=spr(k+m)/spr(k+m);
printf("%d\n",a);
}
同样这题我也搞不懂,spr(k+m)的值是5而不是9,spr(k+m)/spr(k+m)却是7了.答案就成1了.
发表于 2003-7-3 17:26:57 | 显示全部楼层
你的min定义缺少了一个外扩号 所以变成了
10*(x)<(y)? x:y
语句结果当然就是y了  

下面的这个类似
回复

使用道具 举报

发表于 2003-7-3 20:56:57 | 显示全部楼层
#define MIN(x,y) ((x)<(y)? (x): (y))
回复

使用道具 举报

 楼主| 发表于 2003-7-3 21:56:26 | 显示全部楼层
谢谢,第一个问题我明白了.但第二个spr(k+m)/spr(k+m)的值为何是7,怎么做的?
回复

使用道具 举报

发表于 2003-7-4 00:00:44 | 显示全部楼层
k + m * k +m / k + m * k +m
2 + 1 * 2 + 1 / 2 + 1 * 2 + 1
2 + 2 + 0 + 2 + 1
7


so #define spr(x) ((x)*(x))
回复

使用道具 举报

发表于 2003-7-4 00:06:30 | 显示全部楼层
我发现有很多人都没有注意这样的问题哦。
这个也是define的一个弊端。
回复

使用道具 举报

发表于 2003-7-4 11:32:55 | 显示全部楼层
old problem about macro.

inline should be better here.
anyway,  {}, () ,and do {} while (0) is  good for macro
回复

使用道具 举报

发表于 2003-7-5 13:37:34 | 显示全部楼层
小心宏,最后用内联。
回复

使用道具 举报

发表于 2003-7-7 13:01:40 | 显示全部楼层
请看一下谭浩强c语言
关于宏展开的问题
回复

使用道具 举报

发表于 2003-7-7 15:49:32 | 显示全部楼层
谭老师的书虽然很狠狠老了
但是我觉得几乎是中国学C语言人的通用入门教材啊
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-15 14:05 , Processed in 0.032329 second(s), 16 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表