0

我在 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 究竟如何评估没有括号的语句?

4

2 回答 2

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))

Java 教程中的此页面提供了有关运算符优先级及其如何影响表达式评估的更多信息。


值得一提的是,编程语言中的运算符优先级与简单算术表达式的含义之间存在自然的相似之处……就像您在小学时所学的那样。例如,您被教导这与 ;1 + 2 x 3的含义相同1 + (2 x 3)。即答案是7而不是9。用技术术语来说,x(乘法)运算符的优先级高于+(加法)运算符。

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

1 - 例如,由于对主表达式和运算符的求值在某些情况下会产生副作用,因此了解子表达式求值的精确顺序可能很重要。

于 2013-09-03T04:09:24.360 回答
5

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

这里

于 2013-09-03T04:06:37.943 回答