i++和++i为毛会不一样
2015-08-16 14:36
197 查看
今天看到一道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编译器。
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编译器。
相关文章推荐
- 响应式布局
- windows下如何使用thrift,及编译执行的全过程。boost库的使用,libevent 库的使用
- ViewHolder 中空指针 找不到控件
- OJ——华为编程题目:输入字符串括号是否匹配
- cocos2dx 使得单麻将(三)
- 动态链接库、静态链接库
- Liferay6.2教程-把Liferay Portal当做一个协同平台
- 面向对象
- LO Frequency Plan
- 最常用的设计模式
- 【LeetCode】Add Digits
- 笨笨熊搬家——交通(java)-2
- arm的lcd基础显示
- 2015 Multi-University Training Contest 8 hdu 5385 The path
- 九度oj 1038
- [leetcode][math] Add Digits
- 黑客专属记事本(编程记事本)
- hdu 5392 Infoplane in Tina Town (质因子分解求最小公倍数)
- android 控件中layout_width,layout_height与onMeasure(int widthMeasureSpec, int heightMeasureSpec)
- 黑马程序员——C语言笔记之if,if....else....,switch判断