为什么“或”在“和”之前?
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
这样,无论一方是否真实,它们都仍在评估中。
&&
和&