我从Java的官方教程中读到前缀和后缀++ - 具有不同的优先级:
后缀:expr ++ expr--
一元:++ expr --expr + expr -expr~!
根据教程,不应该这样
d = 1; System.out.println(d++ + ++d);
打印6(d++使d 2,++d使它3)而不是4?
我知道++d事先评估的解释,但如果d++有更高的优先权++d,为什么不d++首先评估?更重要的是,在什么情况下应该d++表明它具有更高的优先级?
编辑:
我尝试了以下方法:
d = 1; System.out.println(++d * d++);
它返回4.它似乎应该是2*2,而不是1*3.
考虑以下代码:
int[] r = null;
r[0] = 1 % 0;
Run Code Online (Sandbox Code Playgroud)
我本来希望NullPointerException根据JLS Sec 15.7.1抛出:
在评估右侧操作数的任何部分之前,似乎已对二进制运算符的左侧操作数进行了完全评估。
=是一个二进制运算符(如JLS Sec 15.2 -JLS Sec 15.26中所示,它描述了赋值运算符),并且对左操作数进行完全求值将得出NullPointerException。但是,将ArithmeticException引发一个,指示在对左侧操作数进行完全求值之前先评估右侧操作数。
为什么?