分类：教育/科学-理工学科-数学
问题：若i=5,(++i)+(++i)+(++i)的值为什么是22,而? 
若i=5,(++i)+(++i)+(++i)的值为什么是22,而不是21?
回答：先从简单的说起吧，也就是i=5,s=(++i)+(++i);这个结果应该等于而不是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得到，其它编译器做法可能不同，结果可能会有差异