繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM