日期:2014-05-19 浏览次数:20973 次
public static void main(String[] args) { int i = 0; i=++i+i++; System.out.println(i); }
public class a extends java.lang.Object{ public a(); 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入栈,栈中内容为【0】 1: istore_1 //从栈顶弹出一个int,存到局部变量区索引为1的变量中,即局部变量区索引为1的变量值为0,此时栈中内容为【】 2: iinc 1, 1 //局部变量区索引为1的的变量加1,即局部变量区索引为1的的变量此时值为1,栈中内容为【】 5: iload_1 //将局部变量区索引为1的变量值入栈,栈中内容为【1】 6: iload_1 //将局部变量区索引为1的变量值入栈,栈中内容为【1,1】 7: iinc 1, 1 //局部变量区索引为1的的变量加1,即局部变量区索引为1的的变量此时值为2,栈中内容为【1,1】 10: iadd //从栈顶弹出两个int值,即上面栈中的两个1,相加,再将结果入栈,此时栈中的内容【2】 11: istore_1 //从栈顶弹出一个int,即上面栈中的2,保存到局部变量区索引为1的变量中,即局部变量区索引为1的变量值此时为2,此时栈中的内容为【】 12: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;以下是打印局部变量区索引为1的变量值 15: iload_1 16: invokevirtual #3; //Method java/io/PrintStream.println:(I)V 19: return }
------解决方案--------------------
public class Test { public static void main(String[] args) throws Exception { int i = 0; i=i+++1; System.out.println(i); } }
------解决方案--------------------
在表达式用使用前++是 变量先+1在在表达式中使用,
在表达式中使用后++是 先在表达式中使用在进行+1,
例如:
int i = 0;
int j = ++i; //这个时候先+在用 j = 1; i = 1;
int k = i++; //这个时候先用再+ k = 1; i = 2;
所以你的 i = ++i + i++;中先做了一次++操作i变为1 然后做 i + i 的操作为2,然后又做了一次 ++的操作这个是后i的值为2, 然后再把表达式的值赋值给i即2.这个时候有是回混, 你可以吧i的初始值设为3,你可以看到结果i是8了。