int i = 2;
System.out.println(i + (i++));//输出为4
int i = 2;
System.out.println((i++) + i);//输出为5虽然不建议这么写代码,但是真有这种情况的,为什么?

解决方案 »

  1.   

    看看JVM指令就知道了
     L0
        LINENUMBER 9 L0
        ICONST_2
        ISTORE 0
       L1
        LINENUMBER 10 L1
        GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
        ILOAD 0 //从index为0的地方载入i
        ILOAD 0 //同上
        IINC 0 1 //自增index为0的地方1
        IADD // 这里和index 0一点儿关系都没有了,结果当然是4
        INVOKEVIRTUAL java/io/PrintStream.println(I)V
      

  2.   

    再看看第二个:   L0
        LINENUMBER 14 L0
        ICONST_2
        ISTORE 0
       L1
        LINENUMBER 15 L1
        GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
        ILOAD 0 //从index为0的地方载入i i=2
        IINC 0 1 //自增index为0的单元,这时候i=3了
        ILOAD 0 //从index为0的地方载入i,i=3
        IADD // 2+3=5
        INVOKEVIRTUAL java/io/PrintStream.println(I)V
      

  3.   

    i++说是先将i的值作为表达式(i++)的值,再将i进行++,
    那么实现这一个操作,方法就不同了。
    第一种方法,先将i作为(i++)这个表达式的值,然后与其他操作数进行运算,整个表达式都算完后,再进行i++操作。VC6.0编译出来的程序,就是这么做的。而且用这种方法计算的话,你的表达式当然都会是4.
    而Java使用的方法,只能说明,它先将i作为表达式i++的值,与左边的操作符结合进行运算等到一个值c,运算完后就进行i++操作,然后再将c与右边的操作符结合进行运算,那么这时候,右边的表达式中有i,这个i自然是已经修改过后的了。
      

  4.   

    这涉及到自增问题
    如果用于自增,++i和i++是一样的效果。
    不过,如果用于赋值的话,++i是先加1再赋值,i++是先赋值后加1。
      

  5.   


    挺有意思的问题。不过看结果应该知道是Java编译器是如何处理的了。
      

  6.   

    我觉得+号是右结合性的,所以因从左往右计算,第一题:第一个i为先计算取值为2,第二个i++因为是后加,所以取到的值是2,所以第一题计算结果为4;第二题:第一个i++取到的值是2,第二个i是在第一个i执行++后才取值的,所以i的值这时为3,所以第二题计算结果为5。
      

  7.   

    很简单,第2个是i++完以后再去使用i的值相加,这时候i==3
      

  8.   

    把(i++)就当做是i 看, (i++)以后出现的i 值才是(i+1);
    而(++i)就是直接把i 的值当做(i+1)的值看.这样就很清楚了
    System.out.println(i + (i++);  把i++当做i看. 2+2=4
    System.out.println((i++) + i); i++后又出现i. 2+3=5
      

  9.   

    我是这样理解的
    第一种方法: 因为 i值等于2 i++值等于2  相加完以后运算就结束了。。 所以等于4
    第二种方法: 因为 i++ 值是 2  加上 i的值2 所以等于4 这个结果在运算完相加以后最后才要进行递增 所以得5
      

  10.   

    i + i++ 其实执行的 还是 2+2 
     i++ +i  是2+3  前面的 i=2 ++ 之后 后面的i 就等于三了! 
     这个只要知道运算符的执行顺序 就不难!
      

  11.   


    后缀++是先运算,后自增,所以i+(i++)也就是2+2 ,因为是先运算,所以此行println()结束,所以结果是4如果后面有代码使用到i,那么i的值就会是3了(i++)+i 也就是 先运算后自增,即2+3 ,也就是5 
      

  12.   

    告诉你 记着 把i++ 当成i  一样的 
    i++ 就是先运算再加1 
    ++i 就是先自加1 在运算
      

  13.   

    int i = 2;
    int x = i; // x = 2
    int y = i; // i++,先返回自增前的i,y = 2
    i = i + 1; // i++,然后自增
    System.out.println(x + y); // 2 + 2int i = 2;
    int x = i; // i++,先返回自增前的i,x = 2
    i = i + 1; // i++,然后自增
    int y = i; // y = 3
    System.out.println(x + y); // 2 + 3
      

  14.   

    i+(i++)  2+2
    (i++)+i  2+3
      

  15.   

    i=2
    i+(i++)
    计算步骤:1: 将i的值2赋给(i++)—>(i++)=2
              2:执行i=i+1=3
              3: 执行i+(i++)=2+2=4
    计算步骤:1:1: 将i的值2赋给(i++)—>(i++)=2
              2:执行i=i+1=3
              3:执行(i++)+1=2+3=5;
      

  16.   

    首先 i++ 是参加运算“以后”再进行 i=i+1第一种情况,i=2,输出为 2+2=4,然后i的值变为3第二种情况,i=2,i++先进行运算,结果为2,但是这时,i=i+1=3,所以后面的部分变为3,输出为2+3=5
      

  17.   

    System.out.println((i++) + i)
    第二次取i的时候i已经加完