请大家帮我看看这个宏怎么会出现这种情况?

Woody 2004-12-21 03:24:15
#include <iostream>
using namespace std;
#define cube_macro(a) ((a)*(a)*(a))
inline float cube_inline(float a){return (a)*(a)*(a);}
float cube(float a){ return a*a*a;}
void main(){
int i = 2;
cout<<"cube_macro() = " <<cube_macro(++i)<<endl;
int j = 2;
cout<<"cube_inline() = "<<cube_inline(++j)<<endl;
int m = 2;
cout<<"cube() = "<<cube(++m)<<endl;
}

结果:
cube_macro() = 80
cube_inline() = 27
cube() = 27

为什么cube_macro(++i)的结果会是80呢?
...全文
120 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
Woody 2004-12-21
  • 打赏
  • 举报
回复
我是用的vc6.0。
就是关于函数调用时的出栈、进栈,没学过汇编,编译原理,不大明白,thinking in C++ 上有么?
whoho 2004-12-21
  • 打赏
  • 举报
回复
也就是时,在不同的编译器上,会得到不同的输出
在一个表达式中,不要使用多个i++,或者与i的组合
whoho 2004-12-21
  • 打赏
  • 举报
回复
展开以后,得到一个行未定义的表达式
不要用这种风格
skfox 2004-12-21
  • 打赏
  • 举报
回复
对,这个东西肯定是和编译器有关系了,csdn上关于这类帖子已经很多了。。。
我用的是VC6
yevv 2004-12-21
  • 打赏
  • 举报
回复
关于几目运算符的进栈出栈??

不知道楼主说的什么意思 不过C++的书 : C++编程思想--引领编程届的时尚 哈哈 做广告 :)
robinzsy 2004-12-21
  • 打赏
  • 举报
回复
呵呵.我运行你的程序,结果:
cube_macro() = 125
cube_inline() = 27
cube() = 27

看来 skfox(sky) 有些道理,但还是和编译器有关的.
Woody 2004-12-21
  • 打赏
  • 举报
回复
哦,谢谢了。这些知识,关于几目运算符的进栈出栈,在哪本书可以了解比较透彻?
junnyfeng 2004-12-21
  • 打赏
  • 举报
回复
当然了,i应用了三次++i操作
skfox 2004-12-21
  • 打赏
  • 举报
回复
cube_macro(++i)
直接展开得到(++i)*(++i)*(++i)
*是二目运算符号,先压前面2个进栈,2次++后都变为了4,得到临时变量16(4*4),此时i的值为4在和后面的结合,就变成80了(16*5)

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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