2017-06-09 82 views
0

我用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*应该在+之前调用。有什么我错了吗?

+0

@puhlen没有什么奇怪的或错误的,调用按优先顺序分组,然后按照预期从左到右进行评估,看到我的答案结束。 –

回答

4

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

阅读这个问题,这不是问题。 op + op-op * op在编译为op。+(op).-(op *(op))时产生'+ * -'' – puhlen

+0

我明白这个问题 – Adrian

+0

@puhlen你是什么意思“整个表达”?我没有看到任何其他方式来排序。斯卡拉不假设交换性,所以它正确地避免了在步骤1之前评估步骤(2,3,4),而是在适用的情况下严格按照从左到右的顺序执行。 –