0

几周前我提出了一个类似的问题,但我仍然无法消除对java 运算符优先级的歧义和混淆。这次我有这段代码:

int mask = 0;
int count = 0;
if( ((5<7) || (++count < 10)) | mask++ < 10 )   
    mask = mask + 1;
System.out.println(mask + " " + count);

结果是(出乎我意料):2 0。

此外,编译器提供了一个警告,仅在表达式 (++count<10) 下划线:死代码。

但是,我认为代码的执行可以通过以下方式之一:

1) | 具有比 || 更高的优先级,因此它被认为是表达式 ( (++count<10) | mask++ <10) 周围有括号。这样,编译器应该已经执行了这两个部分,并且 count 应该设置为 1 (++count<10)。

2) 如果编译器首先查看 (5<7) 并且在评估它为 false 之后跳过整个第二个表达式,那么掩码不应该增加,我们将在输出中等待值 1。

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

4

2 回答 2

4

||是一个OR仅在左侧表达式为假时才计算其右侧表达式的运算符。在你的情况下,5 < 7是真实的并且++count < 10不被评估。

另一方面,|总是计算两个表达式:即使((5<7) || (++count < 10))为真,mask++ < 10也会被计算。

于 2013-02-04T10:20:36.520 回答
0

| 具有比 || 更高的优先级,因此它被认为是表达式 ((++count<10) | mask++ <10) 周围有括号。

您的代码中没有这样的表达式。再看一遍。整个表达式是( ((5<7) || (++count < 10)) | mask++ < 10 )。将||常量测试5<7与相关联++count < 10,因为常量测试始终为假,因此永远无法执行,并且将|所有这些与 相关联mask++ < 10

实际上这里根本没有运算符优先级问题,只是您自己对括号放在哪里的误解。

于 2013-02-04T23:37:30.837 回答