java中i=i++ 值无变化原因详解
2010-04-05 14:52
155 查看
想要弄明白JAVA中i=i++没变化的原因,就要了解JAVA虚拟机的”栈“先进后出的运行机制
以下面的代码为例:
public class AddOperatorTest
{
public static void main(String[] args)
{
int i = 0;
i = i++;
System.out.println(i);
}
}
在DOS中运行javap -c(JDK自带反编译器,-c表示显示方法中具体的字节码)
E:/>javac AddOperatorTest.java
E:/>java AddOperatorTest
0
E:/>javap -c AddOperatorTest
Compiled from "AddOperatorTest.java"
public class AddOperatorTest extends java.lang.Object{
public AddOperatorTest();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: iconst_0 //0进栈
1: istore_1 //把栈顶元素(即上一步的0)出栈,放到#1
2: iload_1 //i的值(0)进栈
3: iinc 1, 1 //#1加1,(注意:这里是#1加1而不是i加1)
6: istore_1 ///把栈顶元素(第二步的0)出栈,放到#1,这时#1又改为了0
7: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
10: iload_1 //i的值(0)进栈
11: invokevirtual #3; //Method java/io/PrintStream.println:(I)V
14: return
}
从上面可以看到,所谓的i++是指#1+1,而不是i+1,所以i还是原来的值
以下面的代码为例:
public class AddOperatorTest
{
public static void main(String[] args)
{
int i = 0;
i = i++;
System.out.println(i);
}
}
在DOS中运行javap -c(JDK自带反编译器,-c表示显示方法中具体的字节码)
E:/>javac AddOperatorTest.java
E:/>java AddOperatorTest
0
E:/>javap -c AddOperatorTest
Compiled from "AddOperatorTest.java"
public class AddOperatorTest extends java.lang.Object{
public AddOperatorTest();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: iconst_0 //0进栈
1: istore_1 //把栈顶元素(即上一步的0)出栈,放到#1
2: iload_1 //i的值(0)进栈
3: iinc 1, 1 //#1加1,(注意:这里是#1加1而不是i加1)
6: istore_1 ///把栈顶元素(第二步的0)出栈,放到#1,这时#1又改为了0
7: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
10: iload_1 //i的值(0)进栈
11: invokevirtual #3; //Method java/io/PrintStream.println:(I)V
14: return
}
从上面可以看到,所谓的i++是指#1+1,而不是i+1,所以i还是原来的值
相关文章推荐
- JAVA 内存泄露详解(原因、例子及解决)
- Java内存泄露原因详解
- Java内存泄露原因详解
- JAVA 内存泄露详解(原因、例子及解决)
- Java内存泄露原因详解
- Java内存泄露原因详解
- Java内存泄露原因详解
- Java内存泄露原因详解
- 【JAVA集合详解】Java ConcurrentModificationException异常原因和解决方法
- Java内存泄露原因详解
- Java内存泄露原因详解
- java基础巩固系列(七):java内存泄露原因详解
- JAVA 内存泄露详解(原因、例子及解决)
- Java内存泄露原因详解
- Java内存泄露原因详解
- classpath和path详解配置原因 classpath、path、JAVA_HOME的作用及JAVA环境变量配置
- Java在方法中数组间直接'="赋值没变化的原因
- Java内存泄露原因详解
- JAVA中i=i++没变化的原因
- Java内存泄露原因详解