【问题标题】:Operators precedence in Java gets confusingJava中的运算符优先级变得混乱
【发布时间】:2013-01-19 00:40:00
【问题描述】:

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

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

1) |具有比 || 更高的优先级,因此它被认为是表达式 ( (++count

2) 如果编译器首先查看 (5

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

【问题讨论】:

  • || 周围有额外的括号。因此,您声称 | 的优先级高于 || 是无关紧要的,因为您在表达式中添加了额外的括号。
  • 括号优先级最高,高于|
  • 好吧,你是对的。我怎么没注意到?...

标签: java operators


【解决方案1】:

|| 是一个OR 运算符,仅当左侧表达式为假时才计算其右侧表达式。在您的情况下,5 &lt; 7 为真,++count &lt; 10 未评估。

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

【讨论】:

  • 我完全同意。误解源于没有注意到第一个 exp 周围的括号
  • @arjacsoh 好吧 - 这确实有所作为。
【解决方案2】:

|优先级高于 ||,因此被认为是表达式 ((++count

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-13
    • 2021-10-25
    • 2021-09-30
    • 2011-12-28
    • 2015-08-29
    • 1970-01-01
    相关资源
    最近更新 更多