几周前我设置了一个类似的question,但我仍然无法消除java operators precedence上的含糊不清和混淆。这次我有这段代码:
int mask = 0;
int count = 0;
if( ((5<7) || (++count < 10)) | mask++ < 10 )
mask = mask + 1;
System.out.println(mask + " " + count);
结果是(出乎我意料):2 0。
此外,编译器提供一个警告,仅强调表达式(++ count&lt; 10):dead code。
然而,我认为代码的执行是以下任何一种方式:1)|优先级高于||,因此它被认为是表达式周围有括号((++ count&lt; 10)| mask ++&lt; 10)。这样编译器就应该执行这两个部分,并且计数应该设置为1(++ count&lt; 10)。
2)如果编译器首先查看(5 <7)并且在将其评估为false之后跳过整个第二个表达式,则掩码不应该增加,我们将在输出中等待值1。
我误解了什么,无法解释编译器的行为以及输出?
答案 0 :(得分:4)
||
是一个OR
运算符,如果左侧表达式为false,则仅计算其右侧表达式。在您的情况下,5 < 7
为真,++count < 10
未评估。
另一方面,|
始终评估两个表达式:即使((5<7) || (++count < 10))
为真,也会评估mask++ < 10
。
答案 1 :(得分:0)
|优先级高于||,因此它被认为是表达式周围有括号((++ count&lt; 10)| mask ++&lt; 10)。
您的代码中没有这样的表达式。再看一遍。整个表达式为( ((5<7) || (++count < 10)) | mask++ < 10 )
。 ||
将常量测试5<7
与++count < 10
相关联,由于常量测试始终为false,|
将mask++ < 10
与{{1}}相关联,因此永远无法执行{{1}} }。
事实上,这里根本没有运算符优先问题,只是你自己误解了括号的位置。