Java基础的小问题
  我把书上的原话和例子都写下来请高人解疑。
    如果操作符是混合赋值运算符,那么右操作数种会隐含使用左操作数。这时会先将坐操作数的值记录下来,再对右操作数进行运算,最后对两个值进行运算并赋值。
public class showOrder_2{
public static void main(String args[]){
int a=9;
a +=(a=3);//第一个例子
System.out.println("a="+a);

int b=9;
b=b+(b=3);//第二个例子
System.out.println("b="+b);
}
}
※  在第一个例子中,先计算“+=”的左操作数a,其值为9,并记录下来,然后计算右操作数(a=3),其值为3,所以表达式变成了:a=9+3,值为12。
※  在第二个例子中,先计算“+” 的左操作数b,其值为9,并记录下来,然后计算右操作数(b=3),其值为3,所以表达式的值变成了:b=9+3,值为12。          个人不明白的一点,可能脑子转不过来吧,虽第一例的a +=(a=3);拆开后等于a=a+(a=3);但前面书上讲的是“混合赋值运算符”,才能先记录左边的值而后再对右操作数进行运算,最后对两个值进行运算并赋值。而第二例子中的是+号了,+号并不属于混合赋值运算符呀,应该是算先括号里面的,b=3,然后此刻的+号左边b等于3 两者相加等于6了,请问这是怎么回事呢?
            天资愚笨,还望各位朋友能多多帮忙,在下先谢谢各位咯

解决方案 »

  1.   

    将指令分拆一下,读字节码就明白了,这是有java读取操作数的的顺序决定的。
      

  2.   

    根据运算符的优先级来运行的!
    1 () [] . 从左到右
    2 ! +(正)  -(负) ~ ++ -- 从右向左
    3 * / % 从左向右
    4 +(加) -(减) 从左向右
    5 << >> >>> 从左向右
    6 < <= > >= instanceof 从左向右
    7 ==   != 从左向右
    8 &(按位与) 从左向右
    9 ^ 从左向右
    10 | 从左向右
    11 && 从左向右
    12 || 从左向右
    13 ?: 从右向左
    14 = += -= *= /= %= &= |= ^=  ~=  <<= >>=   >>>= 从右向左
      

  3.   

    请问下,读取操作数的顺序决定的话,那b=b+(b=3);//第二个例子
      先算括号里面的吧?(b=3)这样的话内存里面不是已经把b的值改为3了吗?那此时外面的+号左边的b不是也变成3了吗?
            非常不好意思,我就是卡在这里了,运算程序跑结果了,都是12,但我就是转不过来这个,想不明白,麻烦您了。
      

  4.   

    java中表达式的计算是在运算栈里面进行的。
    int a=9;之后a +=(a=3)的执行是这样的:
    a += (a=3)实际就是 a = a + (a=3);java这样执行,首先计算a + (a = 3),然后将计算结果保存到a。好,具体就是:
    将a读取到栈顶,也就是栈顶为9,再将3保存到栈顶,复制一份,这样栈最上面就是两个三了,将3保存到a(将运算栈的数据保存到局部变量a),这时候最上面的3出栈。执行加法操作,也就是计算9+3,得到12,保存给a。
    这个过程中a被赋值两次,最后的值为12.如果把运算栈理解为一个临时空间的话,我们用变量temp表示:
    a += (a=3)就是:
    temp = a;
    a = 3;
    a = temp + a;
    结束。b=b+(b=3)和上面的完全一样。注意括号的意思和数学里并不一样。
    比如下面代码:public class Test{
    public static void main(String args[]){
    int a = 5;
    int b = 6;
    int c = a*2 + 3 +(6+b);
    }
    }计算c的时候,首先计算出a*2,然后计算a * 2 + 3,再计算6+b,最后计算总和。
    6+b并不会在加3之前计算。
      

  5.   

    都差不多了,那如果用javap来disassemble代码的话:
    int b = 9;
    b = b + (b = 3);
    public static void main(java.lang.String[]);
      Code:
       0:   bipush  9
       2:   istore_1
       3:   iload_1
       4:   iconst_3
       5:   dup
       6:   istore_1
       7:   iadd
       8:   istore_1
       9:   return1.可以看到,先将9存给b
    2.取b值,即9
    3.得到常量值3,与9次第入栈
    4.将3存给b
    5.执行栈中加法操作
    6.保存至b并返回