求教一个C语言问题

SwiftFun 2010-12-29 06:13:43

#include <stdio.h>

#define CUBE(X) ((X) * (X) * (X))

void main()
{
int i = 2;
int a = 81 / CUBE(++i);
printf("%d\n", a);
}


我在VC++6.0下运行的结果是1,求教为什么,代码没有问题,是书上的。
...全文
158 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
NowDoIT 2010-12-30
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 wyfwx 的回复:]
无法预期的结果,即可以出现任何的值
[/Quote]


不是吧,还能有什么值?请教一下。

[Quote=引用 1 楼 hudie1234567 的回复:]
因为你传进去的是++i,宏只是简单的替换,所以替换后分母是:(++i) * (++i) * (++i),也就是3*4*5,最后打印的1就是81/60
[/Quote]
赞同这个。
niuchengshi 2010-12-30
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 wyfwx 的回复:]

无法预期的结果,即可以出现任何的值
[/Quote]

正解。这个是未定义行为。
aa1013911535 2010-12-30
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 hudie1234567 的回复:]
因为你传进去的是++i,宏只是简单的替换,所以替换后分母是:(++i) * (++i) * (++i),也就是3*4*5,最后打印的1就是81/60
[/Q学习 了。。。
wyfwx 2010-12-30
  • 打赏
  • 举报
回复
#include <stdio.h>

#define CUBE(X) ((X) * (X) * (X))
改成这样,你就明白了
void main()
{
int i = 2;
int a = CUBE(++i);
printf("%d\n", a);
}



wyfwx 2010-12-30
  • 打赏
  • 举报
回复
无法预期的结果,即可以出现任何的值
SwiftFun 2010-12-30
  • 打赏
  • 举报
回复
分就给8楼了。
Luke2266 2010-12-30
  • 打赏
  • 举报
回复

[Quote=引用 1 楼 hudie1234567 的回复:]
因为你传进去的是++i,宏只是简单的替换,所以替换后分母是:(++i) * (++i) * (++i),也就是3*4*5,最后打印的1就是81/60
[/Quote]
SwiftFun 2010-12-30
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 lengxujun 的回复:]
引用 14 楼 qq12123589 的回复:
引用 8 楼 wyfwx 的回复:
无法预期的结果,即可以出现任何的值

你把81换成60~80就知道的。。。
编译器问题
八成谭浩强的教材害的


这种代码风格还是不要学习了吧,严重的副作用.

在不同的编译器下可能有不同结果.未请教,出自哪本书?
[/Quote]
是《C安全编码标准》上给出的不安全编码,我只是不理解为什么会出现这个值,书上的说法是++i是具有副作用的表达式,用在宏替换中会出现未定义的行为。所以我赞成8楼的说法。
lengxujun 2010-12-30
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 qq12123589 的回复:]
引用 8 楼 wyfwx 的回复:
无法预期的结果,即可以出现任何的值

你把81换成60~80就知道的。。。
编译器问题
八成谭浩强的教材害的
[/Quote]

这种代码风格还是不要学习了吧,严重的副作用.

在不同的编译器下可能有不同结果.未请教,出自哪本书?
qq12123589 2010-12-30
  • 打赏
  • 举报
回复
[Quote=引用楼主 preyer2011 的回复:]
C/C++ code

#include <stdio.h>

#define CUBE(X) ((X) * (X) * (X))

void main()
{
int i = 2;
int a = 81 / CUBE(++i);
printf("%d\n", a);
}



我在VC++6.0下运行的结果是1,求教为什么,代码没有问题,是书……
[/Quote]
书上叫你用TC2.0的吧。。。
呵呵,像这种好几个++的就不用研究了。。。
这样的代码以后你敢写??
qq12123589 2010-12-30
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 wyfwx 的回复:]
无法预期的结果,即可以出现任何的值
[/Quote]
你把81换成60~80就知道的。。。
编译器问题
八成谭浩强的教材害的
Six_dimensional 2010-12-30
  • 打赏
  • 举报
回复
en 学习了
lc13659669235 2010-12-29
  • 打赏
  • 举报
回复
嗯,应该是这样的,++i就是说先使i自加一,再使用它。
zrlingli0518 2010-12-29
  • 打赏
  • 举报
回复

[Quote=引用 1 楼 hudie1234567 的回复:]
因为你传进去的是++i,宏只是简单的替换,所以替换后分母是:(++i) * (++i) * (++i),也就是3*4*5,最后打印的1就是81/60
[/Quote]
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 hudie1234567 的回复:]
因为你传进去的是++i,宏只是简单的替换,所以替换后分母是:(++i) * (++i) * (++i),也就是3*4*5,最后打印的1就是81/60
[/Quote]+1
無_1024 2010-12-29
  • 打赏
  • 举报
回复
嗯是的 #define宏定义没有优先级的 就是顺序替换
就想叫yoko 2010-12-29
  • 打赏
  • 举报
回复
替换后是81/((++i)*(++i)*(++i))
yuppy 2010-12-29
  • 打赏
  • 举报
回复
+1
[Quote=引用 1 楼 hudie1234567 的回复:]
因为你传进去的是++i,宏只是简单的替换,所以替换后分母是:(++i) * (++i) * (++i),也就是3*4*5,最后打印的1就是81/60
[/Quote]
茫茫大海 2010-12-29
  • 打赏
  • 举报
回复
因为你传进去的是++i,宏只是简单的替换,所以替换后分母是:(++i) * (++i) * (++i),也就是3*4*5,最后打印的1就是81/60

69,373

社区成员

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

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