public static void main(String[] args) {
int i = 0;
i=++i+i++;
System.out.println(i);
}
执行顺序是先i++后++i么?如果是,i++之后,在++i时的值是变化后的值么??

解决方案 »

  1.   

    这种问题,其实运行下javap -c 类名就立马知道原因了
      

  2.   

    int i = 0;
            int k=++i;
            int m=i++;
            i=k+m;
    这样是不是更容易理解些
      

  3.   

    先++i,后i++ 然后两个相加赋值给i 结果是2吧
      

  4.   


    看不懂啊。求翻译。。
    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}
      

  5.   

    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            //常量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}
      

  6.   

    i=0
    i=++i+i++
    ++i 表示先运算后赋值 所以++i 整体为1 ,然后把值赋给i ,所以i=1
    i++ 表示先赋值后运算 因为i已经等于1了,所以i++为1,此时i=1;最终的结果一个就是(++i)+(i++)=2
      

  7.   

    可見其中一個++是待兩操作數都入棧之後才加的,對加法結果沒有影響
    而這個后加的若沒猜錯應該是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
      

  8.   

    在表达式用使用前++是 变量先+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了。