编程语言中的运算符优先级

Operator precedence in programming language

在编程语言class中,我学习了运算符优先级和结合律。下面很简单 Context-Free-Grammar

<expr> -> <expr> + <term> | <term>
<term> -> <term> * <fact> | <fact>
<fact> -> (<expr>) | a

通过使用上面的上下文无关语法,我们可以使句子

a+a+(a+a)

我觉得,操作顺序应该是:(a+a) -> a+a 然后加在一起。然而,在讲座中,教授说了 (a+a) -> a+a 和 a+a -> (a+a) 顺序正确。学生很恐慌。即使在下面的句子中,

(a+a)+((a+a))

顺序 ((a+a)) -> (a+a) 然后加和 (a+a) -> ((a+a)) 都是正确的。 他只是说,做完parse tree,再转成汇编语言 所以顺序取决于编译器。

我不明白他的解释。 谁能解释一下为什么有两种可能的顺序??

评估顺序与分组无关。如果您需要计算 X + Y(其中 XY 是子表达式),无论您是先计算 temp2 = Y 然后 temp1 = X 还是反过来。最后 temp1 + temp2 具有相同的值。

有时先计算右参数更方便。 (例如,也许您已经从以前的计算中知道了它。)

如果 XY 的计算有副作用,则可能需要考虑。有些语言坚持认为副作用是从左到右发生的;其他人允许任何订单。但在任何情况下,括号分组都不会影响计算的 order。它只确定计算的内容。