[英]Operators precedence in Java gets confusing
我在几周前提出了类似的问题,但是我仍然无法消除对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)。 这样,编译器应已执行了这两个部分,并且计数应已设置为1(++ count <10)。
2)如果编译器首先查看(5 <7),然后将其评估为false,则跳过整个第二个表达式,则不应增加mask,我们将在输出中等待值1。
我误解了什么,无法解释编译器的行为以及输出?
||
是一个OR
运算符,仅在左侧表达式为false时才求值其右侧表达式。 在您的情况下, 5 < 7
为真,而++count < 10
不被评估。
另一方面, |
总是对两个表达式求值:即使((5<7) || (++count < 10))
为true,也会对mask++ < 10
求值。
| 的优先级高于||,因此可以认为表达式((++ count <10)| mask ++ <10)周围带有括号。
您的代码中没有这样的表达式。 再看一遍。 整个表达式是( ((5<7) || (++count < 10)) | mask++ < 10 )
。 ||
将常量测试5<7
与++count < 10
关联,因为常量测试始终为false,所以永远不能执行++count < 10
|
将所有这些与mask++ < 10
相关联。
实际上,这里根本没有运算符优先级问题,只是您自己对放在括号中的位置的误解。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.