Java如何评估此声明?

时间:2013-09-03 04:03:40

标签: java expression evaluation operator-precedence

我在if else语句中有这个表达式

if (row % 2 == 0 && col % 2 == 0 || row % 2 == 1 && col % 2 == 1) {
    return 0;
}
else {
    return 1;
}

其行为与预期相同,当行和列均为偶数或两者都为奇数时返回0。令我困惑的是Java没有把它读作

(row % 2 == 0 && (col % 2 == 0 || row % 2 == 1 && col % 2 == 1))

Java如何评估没有括号的语句?

2 个答案:

答案 0 :(得分:6)

  

Java如何读取没有括号的语句?

应用运算符优先级规则。 Java语言规范说&&的优先级高于||,这意味着:

    row % 2 == 0 && col % 2 == 0 || row % 2 == 1 && col % 2 == 1

相当于:

    (row % 2 == 0 && col % 2 == 0) || (row % 2 == 1 && col % 2 == 1)

事实上,==的优先级高于&&,因此相当于:

    ((row % 2 == 0) && (col % 2 == 0)) || ((row % 2 == 1) && (col % 2 == 1))

This page from the Java Tutorial提供有关运算符优先级及其如何影响表达式求值的更多信息。


对于它的价值,编程语言中的运算符优先级与简单算术表达式的含义之间存在着自然的平行关系......正如你在小学教过的那样。例如,您被告知1 + 2 x 31 + (2 x 3)的含义相同;即答案是7而不是9。在技​​术术语中,x(乘法)运算符的优先级高于+(加法)运算符。

在典型的编程语言中,这个想法是相同的,除了有更多的运算符要处理......并且规则(一般来说)更精确地指定 1 。< / p>

1 - 例如,由于初级和算子的评估在某些情况下可能具有副作用,因此了解子表达式的精确评估顺序非常重要。功能

答案 1 :(得分:5)

这是因为优先顺序。 &&优先于||

here