鱼C论坛

 找回密码
 立即注册
查看: 2895|回复: 6

请老师帮忙解答下

[复制链接]
发表于 2017-6-1 22:12:08 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#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);
                  
}
新生,求解释,为什么q=22,而不是21?为什么第二个++j   加的是8???
谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-6-2 00:20:00 | 显示全部楼层
代码编译成汇编可以看得更明白:
movl $5, 40(%esp) # 40(%esp)是j在栈中的地址,j=5
addl $1, 40(%esp) # j=j+1=6
addl $1, 40(%esp) # j=j+1=7
movl 40(%esp), %eax # eax是累加用寄存器,把j放入寄存器
addl %eax, %eax # eax = eax + eax = 7 + 7 = 14 !!注意这里因为优化,对j进行了两次自增后才执行相加操作,因此结果不是我们想象中的6+7,而是7+7。简单来说就是J先自加了两次,得到7,7+7为14,j在自增1为8,14+8为22.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-6-2 18:16:57 | 显示全部楼层
zsy_ 发表于 2017-6-2 00:20
代码编译成汇编可以看得更明白:
movl $5, 40(%esp) # 40(%esp)是j在栈中的地址,j=5
addl $1, 40(%esp)  ...

哇!可不可以再解释的简单点。。。刚开始学,表示前面的根本看不懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-2 18:33:12 | 显示全部楼层
编译器不同,会有不同的结果。不用去纠结这个。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2017-6-2 19:19:45 | 显示全部楼层
刚刚看到小甲鱼的汇编视频里面有讲到这个问题 是因为软件的原因所以不用管它啦  不同软件会有所不同
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-4 18:29:42 | 显示全部楼层
趣味12138 发表于 2017-6-2 18:16
哇!可不可以再解释的简单点。。。刚开始学,表示前面的根本看不懂

编译器不同会有不同的结果,不用纠结于这些。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-7 00:50:12 | 显示全部楼层
这个问题根本可以无视,真正写代码没人会这样写
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-22 16:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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