i++和++i

guilingjia 2011-09-19 09:40:48
代码输出结果?
#define product(x) (x)*(x)
int main()
{
int i=3,j,k;
j=product(i++);
k=product(++i);
printf(j=%d,k=%d",j,k);
return 0;
}

他的答案是9,49,可是我感觉第二个应该是25
...全文
79 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2011-09-19
  • 打赏
  • 举报
回复
这是宏的“侧效”,应该尽量避免出现。
guilingjia 2011-09-19
  • 打赏
  • 举报
回复
懂了,感谢大家了。。。
绿野耕夫 2011-09-19
  • 打赏
  • 举报
回复
楼主奉劝你一句,如果遇到有人拿这个题来面试你,那你可以直接走人了。因为,如果敢在项目里用这样代码的,结局早外被扫地出门。退一步讲,如果这样的代码能在一个公司生存下去,那你在这个公司待下去也必然写不出来优秀的代码。

就程序来说,宏是要展开的,展开结果是:
j = (i++) * (i++);
k = (++i) * (++i);
i++是先用后加,++i是先加后用,因此上面两句相当于:
j = i * i; // 先用
i = i + 1;
i = i + 1; // 后加

i = i + 1; // 先加
i = i + 1;
k = i * i; // 后用
hancker 2011-09-19
  • 打赏
  • 举报
回复
25,应该不可能是。。有可能是30或49
前面那条语句执行完后,I值已经是5了。
后面的,不可能是25吧?
你最好对比汇编指令看看。。
clannadgirl 2011-09-19
  • 打赏
  • 举报
回复
i++*i++; 3*3=9,i=5;
++i*++i; i=7; 7*7=49
cocoabird 2011-09-19
  • 打赏
  • 举报
回复
i自加4次 49是对的
Michael_g 2011-09-19
  • 打赏
  • 举报
回复
宏的参数,不像函数的参数要求值,宏参数会原样代入到宏体中。
小驴 2011-09-19
  • 打赏
  • 举报
回复
j=product(i++); // i=5
k=product(++i); // i=7
Michael_g 2011-09-19
  • 打赏
  • 举报
回复
是49 没错,product 是宏,宏要展开的,你把product原地展开在看看。
guilingjia 2011-09-19
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 michael_g 的回复:]
他的答案是谁的答案?
[/Quote]
《程序员面试宝典》书上的
Michael_g 2011-09-19
  • 打赏
  • 举报
回复
他的答案是谁的答案?

69,369

社区成员

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

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