关于++x与x++的思考
在一些简单的表达式中,对于这两种运算我们可以轻松的得到答案,如:
public class AutotypePromot {
public static void main(String args[]) {
int a = 5,b = 10, y = 0;
y = (a++)*(--b);
System.out.println("a = " + a);
System.out.println("b = " + b);
System.out.println("y = " + y);
}
}
可以得到结果
a = 6
b = 9
y = 45
为容易理解,对于a++这样的表达,我们定义“输出值”为该项在表达式中实际参与计算的值,而将“后续值”定义为该项在参加计算后的值。于是,在上述代码中,(a++)的输出值为5,后续值为6,而(- -b)输出值为9,后续值为9。
但是在稍复杂一点的表达式中,可能就需要多加思考,比如:
y = a+a+++(a+++b);
我在初次计算时的想法是这样的:先计算(a+++b),该项输出值为15,后续值为a=6、b=10,接着再从左往右计算a+a+++16可以得到28,运算程序,显然这样计算是错误的,正确结果如下:
a = 7
b = 10
y = 26
经过思考,我犯的错误有两个:
- 错误理解括号优先级
- 忽略从左到右的计算顺序
首先,括号代表的最高优先级是指在遇到括号时,先进行括号中内容的计算,而并不影响整个表达式从左到右的计算顺序。我的理解却是在整个表达式中,最先计算括号中的表达式,然后再从左到右进行计算。故对于上述表达式,正确的计算过程应该是:
先计算
a+a++
输出值:10、后续值:a=6
接着计算
10+(a+++b)
此时遇到括号,先计算括号中的表达式
(a+++b)
输出值:16、后续值:a=7, b=10
接着计算
10+16=26
对于该过程,我们还可以掌握的一点是a+++b,程序理解为(a++)+b,而不是a+(++b),同样按照从左到右理解即可。
掌握了正确的计算方法后,可以自己多写几个表达式来进行验证,比如:
a=5
a++-a++ = -1
a---a++ = 1
如果你和我犯了同样的错误,希望这篇文章可以帮到你。