在编程语言类中,我学习了运算符优先级和关联性。 under是简单的 Context-Free-Grammar
<expr> -> <expr> + <term> | <term>
<term> -> <term> * <fact> | <fact>
<fact> -> (<expr>) | a
通过使用上面的Context-Free-Grammar,我们可以制作句子
a+a+(a+a)
我认为,操作顺序应如下:(a + a) - &gt; a + a然后加上。然而,在讲座上,教授说(a + a) - &gt; a + a和 a + a - &gt; (a + a)订单是对的。学生们处于恐慌之中。即使在下面的句子中,
(a+a)+((a+a))
两个顺序((a + a)) - &gt; (a + a)然后加上和(a + a) - &gt; ((a + a))是正确的。 他只是说,在解析树后,然后转换为汇编语言 所以顺序取决于编译器。
我不明白他的解释。 有人能解释为什么有两种可能的顺序吗?
答案 0 :(得分:1)
评估顺序与分组无关。如果您需要计算X + Y
(其中X
和Y
是子表达式),那么首先计算temp2 = Y
然后计算temp1 = X
还是其他方式。最后temp1 + temp2
具有相同的值。
有时首先计算右手参数会更方便。 (例如,您可能已经从先前的计算中了解到它。)
如果X
或Y
的计算有副作用,则可能需要考虑这一点。有些语言坚持认为副作用是从左到右发生的;其他人允许任何订单。但在任何情况下,括号分组都不会影响计算的顺序。它只确定计算的内容。