为什么“或”在“和”之前?

int it=9, at=9; if(it>4 || ++at>10 && it>0) { System.out.print("stuff"); } System.out.print(at); 

打印出stuff9,我想知道为什么我认为++at>10 && it>0将首先进行评估,因此得到= 10。

运算符优先级仅控制参数分组; 它对执行顺序没有影响。 在几乎所有情况下,Java规则都说语句是从左到右执行的。 ||的优先级 和&&导致if控制表达式被计算为

 it>4 || (++at>10 && it>0) 

&&优先级越高并不意味着首先评估&& 。 代替,

 it>4 

被评估,因为它是真的, ||的短路行为 意味着根本没有评估右侧。

你的复合表达式相当于

 if(it>4 || (++at>10 && it>0)) 

由于Java运算符优先级规则。 ||的操作数 从左到右进行求值,所以it>4评估it>4 ,这是true ,所以其余部分(整个&&子表达式)根本不需要进行评估(因此不会改变)。

我觉得我应该添加如何实际获得预期的输出。

简要说明: || 运算符使整个表达式短路 ,因此右侧甚至没有被评估。

但是, 不要短路并获得预期的输出,而不是|| 操作员,只需使用| ,像这样:

 int a = 9, b = 9; if(a>4 | ++b>10 && a>0) { System.out.print("stuff"); } System.out.print(b); 

输出就是stuff10

这样,无论一方是否真实,它们都仍在评估中。

&&&