i=5,s=(++i)+(++i)+(++i)为什么等于22?

来源:百度知道 编辑:UC知道 时间:2024/05/20 22:12:35
RT

这题确实比较有意思,刚开始我也以为会等于21,后来试了之后才知道等于22,
深入研究一下,把生成的exe给反汇编了才看出来其中的原因...
先从简单的说起吧,也就是i=5,s=(++i)+(++i);这个结果应该等于14而不是13,为什么呢?看一下下面的汇编代码(通过生成exe反汇编得到)(其中-4ebp是变量i在堆栈中地址,-8ebp是s的地址,eax是寄存器ax)
movl $5, -4(%ebp) ;将i赋值为5
leal -4(%ebp), %eax;取i的地址到ax
incl (%eax) ;将i自增1,此时i为6
leal -4(%ebp), %eax;再取i的地址到ax
incl (%eax) ;再将i自增1,此时i为7
movl -4(%ebp), %eax;将i值放入ax
addl -4(%ebp), %eax;将i值与ax中值相加,得到7+7=14
movl %eax, -8(%ebp);将14放入s中
通过上面的汇编代码分析得,先做完两次自增之后,然后将i空间内的值相加,也就是两个7相加..同理可分析此题的汇编代码,如下
movl $5, -4(%ebp) ;将i赋值为5
leal -4(%ebp), %eax;取i地址到ax
incl (%eax) ;将i自增1,此时i为6
leal -4(%ebp), %eax;再取i地址到ax
incl (%eax) ;i自增1,此时i为7
movl -4(%ebp), %eax;将i值放入ax
movl -4(%ebp), %edx;将i值放入dx
addl %eax, %edx ;将ax与dx相加,并放入dx此时dx=7+7=14
leal -4(%ebp), %eax;取i地址放入ax
incl (%eax) ;i自增1,此时i=8
movl %edx, %eax ;将dx中值放入ax 此时ax=14
addl -4(%ebp), %eax;将ax中值与i相加,得ax=8+14=22
movl %eax, -8