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

这题确实比较有意思,刚开始我也以为会等于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(%ebp);将结果ax=22放入变量s中
由于反汇编得到的汇编代码太长,所以只选取了其中能解决问题的一段解释,其它的大家可以自己在debug下反汇编,然后研究一下代码,就知道编译器是怎么做的了...
注:此汇编代码是用gcc得到,其它编译器做法可能不同,结果可能会有差异

猜你喜欢

转载自blog.csdn.net/u014535295/article/details/85018543
I
5 I