鱼C论坛

 找回密码
 立即注册
查看: 4158|回复: 2

++运算符的疑惑!

[复制链接]
发表于 2012-11-27 20:33:04 | 显示全部楼层 |阅读模式
1鱼币
#include <stdio.h>
void main()
{
int i = 5, j = 5, p , q;
p = (i++)+(i++)+(i++);
q = (++j)+(++j)+(++j);
printf("%d,%d,%d,%d\n", p, q, i, j);

}

运算结果:15,22,8,8
                  Press any key to continue

p=15  i++是先参与运算,自身在加1。 所以就是i+i+i=15
q=22 这里我就理解不了啦, 自身加1后再参与运算  (i+1)+(i+1)+(i+1)  应该是这种表达形式吧  按道理应该等于18  怎么会显示22呢?
请详细解释下  

最佳答案

查看完整内容

这个原因是因为编译器的问题 你大概用的是VC6.0吧 q = (++j) + (++j) + (++j); 在VC6.0中他只会 在实现前2个括号后再实现后面的括号 也就是说 : (++j) 第一个括号 后 j=6 (++j) 第二个括号后 j=7 7 +7 = 14(在vc6.0中先结合前2个 是由于这个编译器的话对寄存器操作的原则和其他编译器有些不同) 最后的一个j=8 加起来就是22 其实在实际的问答中 你的答案为24也是正确的 关键: 在汇编实现时,对寄存器的数 ...
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-11-27 20:33:05 | 显示全部楼层
这个原因是因为编译器的问题  你大概用的是VC6.0吧
q = (++j) + (++j) + (++j);
在VC6.0中他只会 在实现前2个括号后再实现后面的括号
也就是说 :
(++j)  第一个括号 后 j=6
(++j)  第二个括号后  j=7
7 +7 = 14(在vc6.0中先结合前2个 是由于这个编译器的话对寄存器操作的原则和其他编译器有些不同)
最后的一个j=8
加起来就是22

其实在实际的问答中 你的答案为24也是正确的

关键:
在汇编实现时,对寄存器的数值操作的前后性来决定的
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-11-28 10:24:39 | 显示全部楼层
哥们,懂汇编吗?这个问题鱼哥答过的,你学过汇编的话就看看运行过程,一般情况 (++j)+(++j)+(++j)先+1,第一个++j就变成6,第2个++j变成6+1=7,第三个++j变成7+1=8,然后开始加法运算,第一个加法是6+7=13,加后一个++j前还得再加一次8+1=9(++x每运算一次之前都加1),然后13+9=22,不知道兄弟明白没~~
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-11-16 13:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表