在a / b *(c +(d-e))中,将首先评估中缀表示法(d-e),但如果将其转换为后缀ab / cde-+ *,则将首先评估ab /。
为什么ab /首先在后缀中求值而不是d-e?
答案 0 :(得分:1)
乘法和除法是left-associative,这意味着它们是从左到右求值的。由于 a 和 b 是终端(无需进行进一步的评估),因此ab/
已准备好进行评估。到达最后一个术语c+(d-e)
后,我们需要更深入地研究,然后才能评估de-
。
答案 1 :(得分:1)
当您谈论“优先级”(一个旨在消除中缀符号歧义的概念,因此实际上不适用于后缀符号)时,您似乎真的是在说“操作顺序”,这是一个更广泛的概念。
要意识到的一件事是,在小学(通常是肺炎PEMDAS)中讲授的操作顺序不一定是计算机在评估a/b*(c+(d-e))
之类的表达式时所使用的操作顺序。使用PEMDAS,您首先要计算d-e
,然后计算c+(d-e)
等,这与ab/cde-+*
中隐含的顺序不同。但是,有趣的是,许多编程语言实际上将通过使用a/b*(c+(d-e))
的顺序来评估ab/cde-+*
,而不是通过PEMDAS的简单实现来评估。例如,如果在Python中导入模块dis并求值dis.dis("a/b*(c+(d-e))")
以便将a/b*(c+(d-e))
分解为Python字节码,您将得到:
0 LOAD_NAME 0 (a)
2 LOAD_NAME 1 (b)
4 BINARY_TRUE_DIVIDE
6 LOAD_NAME 2 (c)
8 LOAD_NAME 3 (d)
10 LOAD_NAME 4 (e)
12 BINARY_SUBTRACT
14 BINARY_ADD
16 BINARY_MULTIPLY
18 RETURN_VALUE
,很容易看出它与ab/cde-+*
的操作顺序完全相同。实际上,可以将这种后缀表示法视为Python在评估a/b*(c+(d-e))
答案 2 :(得分:1)
两个评估指令都使用相同的参数执行相同的操作并产生相同的结果,因此从这种意义上讲,差异并不重要。
尽管如此,差异还是很重要的。在实践中评估中缀表达式时,永远不会使用小学的算术顺序,因为:
它需要存储更多中间结果。 (a + b)(c + d)(e + f)*(g + h)要求按年级顺序存储4个中间金额,但按通常的顺序仅存储2个。 / p>
在大多数情况下,实施年级到学校的命令实际上更加复杂;和
当子表达式具有副作用时,顺序变得很重要,并且通常的顺序更易于程序员进行推理。