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了,请问这是怎么回事呢?
天资愚笨,还望各位朋友能多多帮忙,在下先谢谢各位咯
我把书上的原话和例子都写下来请高人解疑。
如果操作符是混合赋值运算符,那么右操作数种会隐含使用左操作数。这时会先将坐操作数的值记录下来,再对右操作数进行运算,最后对两个值进行运算并赋值。
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 () [] . 从左到右
2 ! +(正) -(负) ~ ++ -- 从右向左
3 * / % 从左向右
4 +(加) -(减) 从左向右
5 << >> >>> 从左向右
6 < <= > >= instanceof 从左向右
7 == != 从左向右
8 &(按位与) 从左向右
9 ^ 从左向右
10 | 从左向右
11 && 从左向右
12 || 从左向右
13 ?: 从右向左
14 = += -= *= /= %= &= |= ^= ~= <<= >>= >>>= 从右向左
先算括号里面的吧?(b=3)这样的话内存里面不是已经把b的值改为3了吗?那此时外面的+号左边的b不是也变成3了吗?
非常不好意思,我就是卡在这里了,运算程序跑结果了,都是12,但我就是转不过来这个,想不明白,麻烦您了。
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之前计算。
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并返回