扎心i++与--i
int main( )
{ int i = 0;
printf("%d %d %d", i++,--i, i++);
return 0;
}
这是一个很简单的小程序,但是他的执行结果却出乎大多数人的想法,结果为0,1,0。为什么会是这个结果,我们还得从他的汇编代码去分析。
我们可以看出在进行压参数的操作之前,先把参数遍历了一次,在遍历的过程中对函数进行处理。在执行i++时,首先将i的值取出放到一个临时量(ptr[ebp-0D0H])中保存,然后再取了一次i的值放到寄存器中,执行+1操作后再放回i里,i中的值就变成1;执行--i的时候是将i的值取出放入寄存器进行-1再放回i中,此时i的值为0;第三次的操作同第一次,i的值先保存在临时量里,再进行+1操作,i的值变成1。
之后在压参操作中,两次i++都是把临时量的值压进栈,临时量中保存的都是0;--i压的是i的值,最后i的值经历了先加后减再加变成了1,所以最后程序执行结果为0,1,0。