标题:请教:下题的结果为什么是3,28??
只看楼主
xyzyangxu
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2006-6-21
 问题点数:0 回复次数:20 
请教:下题的结果为什么是3,28??

#define MIN(x,y) (x)>(y)?(x):(y)
#define T(x,y,r) x*r*y/4
main()
{
int a=1,b=3,c=5,s1,s2;
s1=MIN(a=b,b-a);
s2=T(a++,a*++b,a+b+c);
printf("%d,%d",s1,s2);
}


按本人的推论:
MIN宏展开后:s1=(a=b)>(b-a)?(a=b):(b-a)
即: (a=3)>(3-1)>(a=3):(3-1)
所以:s1=a=3

T宏展开后:s2=a++*a+b+c*a*++b/4
即: 3*4+4+5*4*3/4
得: 31

不知错在哪里,请指教!

搜索更多相关主题的帖子: MIN 结果 define int 
2006-11-08 14:40
xyzyangxu
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2006-6-21
得分:0 
为什么没人帮我!
2006-11-08 15:28
zzsy04et138
Rank: 1
等 级:新手上路
帖 子:113
专家分:0
注 册:2006-10-18
得分:0 
我运行的结果是:3,27 哦.

2006-11-08 15:34
xyzyangxu
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2006-6-21
得分:0 

我在TC2.0中运行的结果的确是 3,28. 不解!

2006-11-08 16:43
wfd2004
Rank: 1
等 级:新手上路
帖 子:116
专家分:0
注 册:2006-11-7
得分:0 
[QUOTE]T宏展开后:s2=a++*a+b+c*a*++b/4
即: 3*4+4+5*4*3/4
得: 31[/QUOTE]
首先明确一下
此时a = 3;
a++是先运算后加1;
a*++b = 4*4此时b是先加1后运算;
那么宏展开应该是:s2=a++*a+b+c*a*++b/4=3*3+4+5*3*4/4 = 28?
而运行的结果是27
请教问题处在那里?

[此贴子已经被作者于2006-11-10 14:20:35编辑过]


在交流中成长
2006-11-08 16:54
KGB
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2006-11-8
得分:0 

#define MIN(x,y) ((x)>(y)?(x):(y))
#define T(x,y,r) (x*r*y/4)

加个括号吧
#define只是简单的替换
所以最好加上括号
如果真的有问题的话我估计是运算符优先级,运算顺序的问题吧
我没有仔细看你的程序。。。

2006-11-08 18:32
zxd198778
Rank: 1
等 级:新手上路
帖 子:99
专家分:0
注 册:2006-7-30
得分:0 
我在C-FEER上运行的结果是3,27
不知道怎么解释
有高手能解释一下吗


我一个不懂世事的人,希望能在这里学到我想学的一些东西。
2006-11-08 18:56
wfd2004
Rank: 1
等 级:新手上路
帖 子:116
专家分:0
注 册:2006-11-7
得分:0 

关注中!不知道是不是宏展开时出问题了!还是运算符优先级的事情!

[此贴子已经被作者于2006-11-9 13:40:16编辑过]


在交流中成长
2006-11-09 13:39
wyzn12
Rank: 1
等 级:新手上路
帖 子:129
专家分:0
注 册:2006-10-28
得分:0 
#define MIN(x,y) (x)>(y)?(x):(y)
#define T(x,y,r) x*r*y/4
main()
{
int a=1,b=3,c=5,s1,s2;
s1=MIN(a=b,b-a);
s2=T(a++,a*(++b),(a+b+c));
printf("%d,%d",s1,s2);
getch();
}

结果是:3,108
s2=T(a++,a*(++b),(a+b+c));中a的值始终为3,b的值都变为4,相当于s2=T(3,3*4,(3+4+5));


新王登基,血流成河!
2006-11-09 14:08
wyzn12
Rank: 1
等 级:新手上路
帖 子:129
专家分:0
注 册:2006-10-28
得分:0 
以下是引用xyzyangxu在2006-11-8 14:40:02的发言:

#define MIN(x,y) (x)>(y)?(x):(y)
#define T(x,y,r) x*r*y/4
main()
{
int a=1,b=3,c=5,s1,s2;
s1=MIN(a=b,b-a);
s2=T(a++,a*++b,a+b+c);
printf("%d,%d",s1,s2);
}


按本人的推论:
MIN宏展开后:s1=(a=b)>(b-a)?(a=b):(b-a)
即: (a=3)>(3-1)>(a=3):(3-1)
所以:s1=a=3

T宏展开后:s2=a++*a+b+c*a*++b/4
即: 3*4+4+5*4*3/4
得: 31

不知错在哪里,请指教!

呵呵不好意思,刚才看错你的意思了,我觉得应该是这样,s2里的a始终不变,因为a是用完了再加1,所以a在这个表达式里都不变(都等于3),b是没用之前加1后再用,所以s2=3*3+4+5*3*4/4=28


新王登基,血流成河!
2006-11-09 14:27



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-101499-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.236440 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved