Java中的运算符优先级令人困惑

时间:2013-02-04 10:18:21

标签: java operators

几周前我设置了一个类似的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。

我误解了什么,无法解释编译器的行为以及输出?

2 个答案:

答案 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}} }。

事实上,这里根本没有运算符优先问题,只是你自己误解了括号的位置。