当时学习的时候碰到的Java 关于 i=i++ 问题 解答
2017-05-18 11:43
399 查看
int i=0;
i=i++;
结果i是多少?
这是一个经常被提及的问题,答案一直五花八门。
具体测试一下以说明问题:
代码1:
public class Test{
public static void main(String[] args){
int i=0;
i=i++;
System.out.println(i);
}
}
结果i依然是0.分析其反编译后的代码:
public static void main(java.lang.String[]);
Code:
0: iconst_0
//0放到栈顶
1: istore_1
//把栈顶的值保存到局部变量1,也就是i中
2: iload_1
//把i的值放到栈顶,也就是说此时栈顶的值是0
3: iinc 1, 1
//注意这个指令,把局部变量1,也就是i,增加1,这个指令不会导致栈的变化,也就是说局部变量1,即i此时为1了。
6: istore_1
//把栈顶的值(0)保存到局部变量1,也就是让i为0了,所以最后i为0
7: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
10: iload_1
11: invokevirtual #3; //Method java/io/PrintStream.println:(I)V
14: return
值得注意到是i被修改了两次,第一次是i++;i变为1,最后一次是i=0;所以结果i是0
代码2:
public class Test2{
public static void main(String[] args){
int i=0;
int j=0;
j=i++;
System.out.println(i);
System.out.println(j);
}
}
这个结果肯定都知道,i是1,j是0.同样看反编译之后的代码:
public static void main(java.lang.String[]);
Code:
0: iconst_0
1: istore_1
//i=0
2: iconst_0
3: istore_2
//j=0
4: iload_1
//把i的值放到栈顶,也就是说此时栈顶的值是0
5: iinc 1, 1
//局部变量1加1,也就是让i++了,此时i已经是1了,上面说过,此指令不会导致栈变化
8: istore_2
//把栈顶的值(注意是0)存入局部变量2,也就是j中,所以j=0
9: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
12: iload_1
13: invokevirtual #3; //Method java/io/PrintStream.println:(I)V
16: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
19: iload_2
20: invokevirtual #3; //Method java/io/PrintStream.println:(I)V
23: return
很明显可以看出,Java是先把i的值取出来放到栈顶,我们可以认为是引入了第三个变量int
k=i;然后i++,这时候i为1了,然后让j=k;也就是0.结论,i的++运算是在对j这个变量的赋值之前完成的。
代码3:
public class Test3{
public static void main(String[] args){
int i=0;
int j=0;
j=++i;
System.out.println(i);
System.out.println(j);
}
}
结果大家也都知道,i=1,j=1
看操作过程:
public static void main(java.lang.String[]);
Code:
0: iconst_0
1: istore_1
//i=0
2: iconst_0
3: istore_2
//j=0
4: iinc 1, 1
//局部变量i加1,这时候i变成1了 。
7: iload_1
//把i的值放到栈顶,栈顶的值是1
8: istore_2
//j=1
9: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
12: iload_1
13: invokevirtual #3; //Method java/io/PrintStream.println:(I)V
16: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
19: iload_2
20: invokevirtual #3; //Method java/io/PrintStream.println:(I)V
23: return
对比代码2和代码3,关键的差别就是iload_1 个iinc这两条指令的位置变了。
当然:如果在C++中:上边的代码 运行结果必定是a=10.
转自:
http://blog.csdn.net/ZangXT/archive/2008/11/05/3229281.aspx
i=i++;
结果i是多少?
这是一个经常被提及的问题,答案一直五花八门。
具体测试一下以说明问题:
代码1:
public class Test{
public static void main(String[] args){
int i=0;
i=i++;
System.out.println(i);
}
}
结果i依然是0.分析其反编译后的代码:
public static void main(java.lang.String[]);
Code:
0: iconst_0
//0放到栈顶
1: istore_1
//把栈顶的值保存到局部变量1,也就是i中
2: iload_1
//把i的值放到栈顶,也就是说此时栈顶的值是0
3: iinc 1, 1
//注意这个指令,把局部变量1,也就是i,增加1,这个指令不会导致栈的变化,也就是说局部变量1,即i此时为1了。
6: istore_1
//把栈顶的值(0)保存到局部变量1,也就是让i为0了,所以最后i为0
7: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
10: iload_1
11: invokevirtual #3; //Method java/io/PrintStream.println:(I)V
14: return
值得注意到是i被修改了两次,第一次是i++;i变为1,最后一次是i=0;所以结果i是0
代码2:
public class Test2{
public static void main(String[] args){
int i=0;
int j=0;
j=i++;
System.out.println(i);
System.out.println(j);
}
}
这个结果肯定都知道,i是1,j是0.同样看反编译之后的代码:
public static void main(java.lang.String[]);
Code:
0: iconst_0
1: istore_1
//i=0
2: iconst_0
3: istore_2
//j=0
4: iload_1
//把i的值放到栈顶,也就是说此时栈顶的值是0
5: iinc 1, 1
//局部变量1加1,也就是让i++了,此时i已经是1了,上面说过,此指令不会导致栈变化
8: istore_2
//把栈顶的值(注意是0)存入局部变量2,也就是j中,所以j=0
9: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
12: iload_1
13: invokevirtual #3; //Method java/io/PrintStream.println:(I)V
16: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
19: iload_2
20: invokevirtual #3; //Method java/io/PrintStream.println:(I)V
23: return
很明显可以看出,Java是先把i的值取出来放到栈顶,我们可以认为是引入了第三个变量int
k=i;然后i++,这时候i为1了,然后让j=k;也就是0.结论,i的++运算是在对j这个变量的赋值之前完成的。
代码3:
public class Test3{
public static void main(String[] args){
int i=0;
int j=0;
j=++i;
System.out.println(i);
System.out.println(j);
}
}
结果大家也都知道,i=1,j=1
看操作过程:
public static void main(java.lang.String[]);
Code:
0: iconst_0
1: istore_1
//i=0
2: iconst_0
3: istore_2
//j=0
4: iinc 1, 1
//局部变量i加1,这时候i变成1了 。
7: iload_1
//把i的值放到栈顶,栈顶的值是1
8: istore_2
//j=1
9: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
12: iload_1
13: invokevirtual #3; //Method java/io/PrintStream.println:(I)V
16: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
19: iload_2
20: invokevirtual #3; //Method java/io/PrintStream.println:(I)V
23: return
对比代码2和代码3,关键的差别就是iload_1 个iinc这两条指令的位置变了。
当然:如果在C++中:上边的代码 运行结果必定是a=10.
转自:
http://blog.csdn.net/ZangXT/archive/2008/11/05/3229281.aspx
相关文章推荐
- 关于异常的疑难解答:System.BadImageFormatException (32 位上编译的.net程序,在64位上跑的时候,经常碰到的问题)
- 关于UCOS学习OSMboxCreate(NULL)的问题,希望遇到同样问题的人得到合理的解答
- 学习安卓开发过程中遇到关于R.Java文件的问题
- 关于java字符的编码问题学习
- 关于java学习之中遇到的一些问题之:java.util.NoSuchElementException.
- 数据结构学习足迹:绪论Triplet碰到的问题及分析解答
- 关于钢琴学习的若干问题的混蛋解答 【2014/1/29更新,未完待续…………】
- java中使用堆外内存,关于内存回收需要注意的事和没有解决的遗留问题(等大神解答)
- Java IO学习【2】一个关于换行、续写的的小问题
- 今天开始学习Struts2 @_@ 马上就碰到问题了..人衰么? 关于 struts2.2.1启动报javassist....错误
- JAVA学习笔记_关于异常机制处理问题
- 关于flex 和java上传是用FileReference 时候遇到的问题
- 用java写http server时候关于favicon.ico问题
- 现在想起来,一个最早学习编程的时候的问题, 关于文本文件的读写
- 关于安装 VMware tools 时候碰到的问题解决,多篇网摘
- 工作学习 问题总结 java 基础 关于arraylist.addall
- 关于学习java中的按位取反(~)的问题
- java.security.cert.CertificateException: Selenium 自动化的时候调用API 执行操作引起的关于https的问题
- Java学习笔记(三)——关于Scanner类在读取字符是跳过的问题
- ddpush 学习之路 15 关于DDPUSH 的一些很多人会问到的问题和解答