i++和++i为毛会不一样
今天看到一道java面试题:
package algorithms.com.guan.javajicu;
public class Inc {
public static void main(String[] args) {
Inc inc = new Inc();
int i = 0;
inc.fermin(i);
i= i++;
System.out.println(i);
}
void fermin(int i){
i++;
}
}
输出的结果是0.网上有解释说:java是先把i的值赋给temp,然后实现自加,加完以后返回temp给i,所以会覆盖掉i加了之后的值。然后举了个例子说C语言不是这样,亲测一把C的,结果如下:
#include<stdio.h>
main(){
int i = 0;
i = i++;
i = ++i;
printf("i=%d\n",i);
}
输出结果为:1.
和网上的解释不符合,汇编一把->
执行i++的时候,执行了如下步骤:
将i的值取出放到寄存器EAX里 -> EAX的值加1后放到EDX里 -> 将EDX的值放回i中 -> 返回EAX的值给前方赋值变量,所以取得的值都是i自增之前的值(而在i=i++中,又将EAX的值赋给了i,所以i已经自增过的值会被原先的值给替换掉)
在执行++i的时候,就简单的多:
一步到位,就是add &i,1;
测试环境:windows 7, 64-bit, GNU GCC编译器。