【问题标题】:Postfix notation is changing precedence of parentheses in evalution后缀符号正在改变评估中括号的优先级
【发布时间】:2019-10-17 16:37:35
【问题描述】:

在 a/b*(c+(d-e)) 中,中缀表示法 (d-e) 将首先被评估,但如果我们将其转换为后缀 ab/cde-+*,那么 ab/ 将首先被评估。

为什么 ab/ 在 post-fix 中首先评估而不是 d-e?

【问题讨论】:

  • 因为这与编程没有直接关系,所以在Mathematics 上可能会更好(同时添加一个实际问题而不仅仅是一个语句)

标签: math data-structures stack complexity-theory theory


【解决方案1】:

两个评估顺序使用相同的参数执行相同的操作并产生相同的结果,因此从这个意义上说,差异并不重要。

不过,有些差异很重要。在实际计算中缀表达式时,从不使用小学算术顺序,因为:

  1. 它需要存储更多的中间结果。 (a+b)(c+d)(e+f)*(g+h) 需要按小学顺序存储 4 个中间和,但按通常顺序只存储 2 个。

  2. 在大多数情况下,执行小学顺序实际上更复杂;和

  3. 当子表达式有副作用时,顺序变得很重要,程序员更容易理解通常的顺序。

【讨论】:

    【解决方案2】:

    当您谈论“优先级”(一个旨在消除中缀表示法歧义的概念,因此并不真正适用于后缀表示法)时,您似乎真正指的是“操作顺序”,这是一个更广泛的概念。

    需要意识到的一点是,小学教授的运算顺序(通常使用肺炎 PEMDAS)不一定是计算机在评估 a/b*(c+(d-e)) 之类的表达式时使用的运算顺序。使用 PEMDAS,您将首先计算 d-e 然后 c+(d-e) 等等,这ab/cde-+* 中隐含的顺序不同的顺序。但是,有趣的是,许多编程语言实际上会使用ab/cde-+* 的顺序来评估a/b*(c+(d-e)),而不是通过简单的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)) 时使用的基于堆栈的计算的简写形式

    【讨论】:

    • 这是一个慷慨的答案。
    【解决方案3】:

    乘法和除法是left-associative,这意味着它们是从左到右计算的。由于 ab 是终端(无需进行进一步评估),ab/ 已准备好进行评估。一旦我们到达最后一个学期c+(d-e),我们需要更深入地研究,然后才能评估de-

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多