【发布时间】:2013-09-26 08:08:09
【问题描述】:
在“Scala 编程”一书(Martin Odersky,第 2 版)中,他们给出了这个运算符优先级表(此处不完整):
* / %
+ -
:
= !
< >
&
^
|
因此,如果一个运算符的第一个字符在此表中的位置高于另一个运算符的第一个字符,则先计算前一个运算符。
根据该代码应该打印出yy,但它会打印出x:
def x() = { print('x'); true }
def y() = { print('y'); true }
x || y && y // prints `x` but should `yy`
我的理解是,如果&在表中比|高,必须先求值。就像 * 优先于 +,所以在x + y * y 中,最后一条语句首先被求值。
编辑:
也看看这段代码
def x() = { print('x'); 1 }
def y() = { print('y'); 3 }
x == x + y * y // xxyy
看起来它从左到右评估它们,但根据表格“解决”它们。
【问题讨论】:
-
因为在第二种情况下
x和y结果为Int并且在布尔值的情况下它使用不同的评估模型 -
|与||不同,并且本书没有给出逻辑操作数的优先级。我假设在&&仍然高于||的Java 中使用相同的优先级,但是这里的工作存在短路。 Java 也会打印“x”。
标签: scala