public static void main(String[] args) {
int i = 0;
i=++i+i++;
System.out.println(i);
}
执行顺序是先i++后++i么?如果是,i++之后,在++i时的值是变化后的值么??
解决方案 »
- 一个java小程序 求帮助
- JBPM4.4 自由流/回退问题
- Eclipse 3.1.2安装lomboz 3.1.2后 window - preferences不显示lomboz项
- 如何调用Struts连接池
- 用Transformer转XML时属性的顺序问题.
- tiles中的资源绑定问题
- 同样jsp文件dreamweaver打开正常,JB9打开中文内容为乱吗,运行显示为乱吗,服务器WEBLOGIC8
- 请各位学过或正在学或了解或精通SOAP的大人们进来看看
- 谁要全套的 optimizeit enterprise 5.5的全套注册码,和我联系,
- PetStore 1.3.1的waf的标签定义文件好像有bug
- struts2 textfield标签使用问题
- java的异常捕获是必须的吗?
int k=++i;
int m=i++;
i=k+m;
这样是不是更容易理解些
看不懂啊。求翻译。。
E:\>javap -c a
Compiled from "a.java"
public class a extends java.lang.Object{
public a();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: returnpublic static void main(java.lang.String[]);
Code:
0: iconst_0 //应该是定义常量i为0
1: istore_1 //i存储1,是执行i++??
2: iinc 1, 1 // inc是啥?
5: iload_1 //i 载入1
6: iload_1 //i 载入1
7: iinc 1, 1 // ??
10: iadd //i加
11: istore_1 //i存1
12: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
15: iload_1
16: invokevirtual #3; //Method java/io/PrintStream.println:(I)V
19: return}
public a();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: returnpublic 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}
i=++i+i++
++i 表示先运算后赋值 所以++i 整体为1 ,然后把值赋给i ,所以i=1
i++ 表示先赋值后运算 因为i已经等于1了,所以i++为1,此时i=1;最终的结果一个就是(++i)+(i++)=2
而這個后加的若沒猜錯應該是i++,可以通過程序再驗證一下:
public class Test {
public static void main(String[] args) throws Exception {
int i = 0;
i=i+++1;
System.out.println(i);
}
}public class Test extends java.lang.Object{
public Test();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: returnpublic static void main(java.lang.String[]) throws java.lang.Exception;
Code:
0: iconst_0
1: istore_1
2: iload_1
3: iinc 1, 1
6: iconst_1
7: iadd
8: istore_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: return}一樣是load入棧后再iinc,對加法結果不構成影響,運行結果是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了。