更容易看到x = 1而不是2的情况。输出为
x=17。
理解这一点的关键是在JLS
15.7.2中,该状态指出在执行操作的任何部分之前,将对每个操作数进行全面评估。
Java编程语言保证,在执行操作本身的任何部分之前,对运算符的每个操作数(条件运算符&&,||和?:除外)都应进行完全评估。
因此,将评估x ++(3次,以适当的优先级从左到右,这在这里不成问题),然后评估运算*并将其分配给原始值。
x = 1 + (1 * 2 * 3)
如果x以2开头,则得到:
x = 2 + (2 * 3 * 4)
与C语言不同,它在Java中定义良好,并且在任何运行时中每次调用时的行为都相同。
关联的ideone(如果有人要自己运行):https://ideone.com/Y2qcJ6



