在“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
看起来它从左到右评估它们,但根据表格“解决”它们。