C简单的问题,我就是不懂!---解决给你20分

yjy001 2003-05-22 08:57:58
#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("\n%d",s1);
printf("\n%d",s2);
}

为什么s2的输出是28呢?
...全文
92 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
smuu 2003-05-22
  • 打赏
  • 举报
回复
潭浩强的书就是不好
短歌如风 2003-05-22
  • 打赏
  • 举报
回复
问题是这样的:
a++ * a + b + c * a * ++b / 4
相当于(a++*a+b) + (c*a*++b/4),标准对于应该先计算(a++*a+b)还是先计算(c*a*++b/4)并没有规定,所以如果说它等于27也是对的。如果仔细分析,可能还有其它结果也正确,所以说,这个表达式究竟应该等于几,是没有意义的。
simo 2003-05-22
  • 打赏
  • 举报
回复
类似的问题,见深入浅出MFC:)
zzqzzq 2003-05-22
  • 打赏
  • 举报
回复
因为s2=a++*a+b+c*a* ++b/4;
yjy001 2003-05-22
  • 打赏
  • 举报
回复
我再验证一下,我会及时结贴的,放心。
yjy001 2003-05-22
  • 打赏
  • 举报
回复
哦,小弟受到你的启发,现在想到可能是这样的:
s2 = a++ * a + b + c * a * ++b / 4
先根据运算符的优先级,先计算了 a++ ,++b这样a=3,b=4
再进行计算s2=3*3+4+5*3*4/4=28,是吗?
短歌如风 2003-05-22
  • 打赏
  • 举报
回复
这里面有两个问题:
1:
#define T(x,y,r) x*r*y/4没有对参数加上括号。由于宏只是简单的替换,而不是先对参数求值,它会导致由于操作符级别的原因而导致它的运算结果与它看上去的函数形象不同,从而影响可读性。应该写成:
#define T(x,y,r) ((x) * (r) * (y) /4);
2:
在调用宏代码时使用了带有副作用的操作符。无论是在宏中还是在函数调用中或者是复杂表达式中使用有副作用的操作符(或函数调用)都会影响可读性。尤其是同时还使用被这个副作用影响的变量时,它的结果可能根本就是未定义的——在不同的编译器下可能会不相同。

如果这道题是为了让你明白宏的危害,现在它的目的已经达到了;如果不是,建议你把这道题从你的大脑中彻底删除(按住shift,不要放到回收站^_^),在这个问题上花时间是没有必要的。
短歌如风 2003-05-22
  • 打赏
  • 举报
回复
使用宏替换的代码本来就很难懂,看不懂是正常的。
现在我们手工把宏替换展开:
main()
{
int a = 1, b = 3, c = 5, s1, s2;
s1 = (a = b) > (b - a)?(a = b): (b - a);
//这时s1 = 3, a = 3,其余不变;
s2 = a++ * a + b + c * a * ++b / 4;
//由于这里有很多有副作用的操作符,我也不知道它应该是多少才对了。
}
yjy001 2003-05-22
  • 打赏
  • 举报
回复 1
不是我要这么写,是老谭的〈C程序设计试题汇编〉第168页的8-35题,小弟怎么也得不出28,可在TC2.0里面就是28,怎么回事啊!
晨星 2003-05-22
  • 打赏
  • 举报
回复
程序设计中应该避免这种代码。

70,012

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧