请老师帮忙解答下
#include <stdio.h>void main()
{
inti=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???
谢谢 代码编译成汇编可以看得更明白:
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. zsy_ 发表于 2017-6-2 00:20
代码编译成汇编可以看得更明白:
movl $5, 40(%esp) # 40(%esp)是j在栈中的地址,j=5
addl $1, 40(%esp)...
哇!可不可以再解释的简单点。。。刚开始学,表示前面的根本看不懂 编译器不同,会有不同的结果。不用去纠结这个。 刚刚看到小甲鱼的汇编视频里面有讲到这个问题 是因为软件的原因所以不用管它啦不同软件会有所不同 {:10_257:} 趣味12138 发表于 2017-6-2 18:16
哇!可不可以再解释的简单点。。。刚开始学,表示前面的根本看不懂
编译器不同会有不同的结果,不用纠结于这些。 这个问题根本可以无视,真正写代码没人会这样写
页:
[1]