|  | 
 
 发表于 2016-6-21 13:45:52
|
显示全部楼层 
| 本帖最后由 EzioA 于 2016-6-21 13:47 编辑 
 反汇编之后得出这样的结论,如图。
 在内存里面,i的值以dword的形式(64位)被存储在ebp-4的地方,也就是图的最下面的位置。
 首先,C语言的参数传递是从右往左的,并且用到栈空间。图的上方就是栈空间中使用到的位置。
 
 第一个参数为-i--,从ebp-4的位置取出i,算出-i的值后,将-i存储在ebp-8的位置,然后把ebp-8的数据送到栈里面,也就是上半部分中最下面的-i。
 
 第二个参数为-i++,从ebp-4的位置取出i,算出-i的值,存储在ebp-0c H的位置,然后将ebp-0c H的数据送到栈里面,也就是上半部分中第二个-i。
 
 第三个参数为i--,从ebp-4的位置取出i,直接存储在ebp-10 H的位置,然后将ebp-10 H的数据送入栈,也就是上半部分的第三个数据,i。
 
 第四个参数为i++,从ebp-4的位置取出i,直接存储在ebp-14H的位置,然后将ebp-14 H的数据送入栈,也就是上半部分的第四个数据,i。
 
 第五个参数为--i,从ebp-4的位置取出i,计算出i-1的值,用i-1覆盖ebp-4的数据,也就是原来ebp-4位置处存储的是i,现在变成了i-1。然后取出ebp-4的数据,将之入栈,也就是上半部分第五个数据,i-1。
 
 第六个参数为++i,从ebp-4的位置取出i-1,计算出(i-1)+1的值,然后覆盖ebp-4的数据,也就是ebp-4位置处的数据又变成了i。然后取出ebp-4的数据,入栈,也就是上半部分的第六个数据,i。
 
 然后依次出栈:i   i-1   i   i   -i   -i
 函数输出的结果也就是这个样子。
 
 其实这样看上去,-i++和-i--这种语句最好不要使用,因为++和--的优先级比-还要高,但是在使用的时候,先使用-i的数据,才进行++和--操作。在这里,-i++和-i--作为printf()参数的时候,++和--甚至是被忽略了,函数接接收的数据只是-i和-i。
 | 
 评分
| 参与人数 2 | 荣誉 +3 | 鱼币 +8 | 贡献 +1 | 收起
理由 |  
|  屁哥 | + 3 | + 3 | + 1 | 希望有一天我也能写出这样的结论 |  
|  n0noper |  | + 5 |  | 其实层主就说该编译器从右往左运算楼主就应. |  
查看全部评分
 |