Scala 中的运算符优先级表现得很奇怪
Operator precedence in scala behaves strange
我在 Scala 中试验运算符优先级,这里发生了一些奇怪的事情:
class Op{
def +(that:Op):Op={println("called +");this}
def -(that:Op):Op={println("called -");this}
def *(that:Op):Op={println("called *");this}
def /(that:Op):Op={println("called /");this}
def %(that:Op):Op={println("called %");this}
}
val op = new Op;
op+op-op*op/op%op ;
op+op*op ;
对于第一行,输出是:
called +
called *
called /
called %
called -
(注意+
在*
之前被调用。)然而,对于第二行,输出是:
called *
called +
(*
在 +
之前被调用。)根据我读到的 here 我相信 *
应该在 +
之前被调用。是不是我弄错了什么?
Scala 按优先级对表达式进行分组,然后严格从左到右对组求值,从而遵循优先级。
您的第二次调用相当于
op.+(op.*(op))
从里到外评价
与第一次调用相同:
op+op-op*op/op%op
应用优先级后,
op+op-(op*op/op%op)
或
(op+op).-(op*op/op%op)
或
// 1 5 2 3 4
op.+(op).-(op.*(op)./(op).%(op))
我在 Scala 中试验运算符优先级,这里发生了一些奇怪的事情:
class Op{
def +(that:Op):Op={println("called +");this}
def -(that:Op):Op={println("called -");this}
def *(that:Op):Op={println("called *");this}
def /(that:Op):Op={println("called /");this}
def %(that:Op):Op={println("called %");this}
}
val op = new Op;
op+op-op*op/op%op ;
op+op*op ;
对于第一行,输出是:
called +
called *
called /
called %
called -
(注意+
在*
之前被调用。)然而,对于第二行,输出是:
called *
called +
(*
在 +
之前被调用。)根据我读到的 here 我相信 *
应该在 +
之前被调用。是不是我弄错了什么?
Scala 按优先级对表达式进行分组,然后严格从左到右对组求值,从而遵循优先级。
您的第二次调用相当于
op.+(op.*(op))
从里到外评价
与第一次调用相同:
op+op-op*op/op%op
应用优先级后,
op+op-(op*op/op%op)
或
(op+op).-(op*op/op%op)
或
// 1 5 2 3 4
op.+(op).-(op.*(op)./(op).%(op))