【问题标题】:What is the difference between precedence, associativity, and order?优先级、关联性和顺序之间有什么区别?
【发布时间】:2010-09-09 09:41:03
【问题描述】:

这种混淆的产生是因为大多数人都接受过根据 PEDMAS or BODMAS rule 计算算术表达式的培训,而 C# 等编程语言中的算术表达式却不能以相同的方式工作。

您对此有何看法?

【问题讨论】:

    标签: c# arithmetic-expressions


    【解决方案1】:

    我不确定是否真的有区别。传统的 BODMAS(括号、命令、除法、乘法、加法、减法)或 PEDMAS(括号、指数、除法、乘法、加法、减法)只是所有可能操作的子集,并表示这些操作应该应用的顺序. 我不知道有什么语言违反了 BODMAS/PEDMAS 规则,但每种语言通常都会添加各种其他运算符 - 例如 ++、--、= 等。

    我总是将运算符优先级列表放在手边,以防出现混淆。然而,当有疑问时,通常值得使用一些括号来明确含义。请注意,括号没有最高优先级 - 请参阅 http://msdn.microsoft.com/en-us/library/126fe14k.aspx 以获取 C++ 中的示例。

    【讨论】:

      【解决方案2】:

      优先级和关联性都指定应如何以及以何种顺序将术语拆分为子术语。换句话说,如果没有明确指定,它是否指定了隐式设置括号的规则。

      如果您有一个没有括号的术语,则从优先级最低的运算符开始并将其括在括号中。

      例如:

      优先级:

      1. .
      2. *,/
      3. +,-
      4. ==
      5. &&

      术语:

      !person.isMarried && person.age == 25 + 2 * 5
      

      会这样分组:

      1. !(person.isMarried) && (person.age) == 25 + 2 * 5
      2. (!(person.isMarried)) && (person.age) == 25 + 2 * 5
      3. (!(person.isMarried)) && (person.age) == 25 + (2 * 5)
      4. (!(person.isMarried)) && (person.age) == (25 + (2 * 5))
      5. (!(person.isMarried)) && ((person.age) == (25 + (2 * 5)))
      6. ((!(person.isMarried)) && ((person.age) == (25 + (2 * 5))))

      一个非常常见的规则是 * 和 / 在 + 和 - 之前的优先级。

      关联性指定具有相同优先级的运算符在哪个方向上分组。大多数运算符是从左到右的。一元前缀运算符是从右到左的。

      例子:

      1 + 2 + 3 + 4
      

      这样分组:

      1. (1 + 2) + 3 + 4
      2. ((1 + 2) + 3) + 4
      3. (((1 + 2) + 3) + 4)

      同时

      !!+1

      被分组为

      1. !!(+1)
      2. !(!(+1))
      3. (!(!(+1)))

      到目前为止,一切都符合 BODMAS/PEDMAS 规则,您经历过哪些差异?

      【讨论】:

        【解决方案3】:

        Precedence 规则指定运算符的优先级(首先评估哪些运算符,例如乘法的优先级高于加法,PEMDAS)。

        关联性 规则说明了相同优先级的运算符是如何分组的。算术运算符是左结合的,但赋值是右结合的(例如,a = b = c 将被计算为 b = c,a = b)。

        order 是应用 precedenceassociativity 规则的结果,并告诉如何计算表达式 - 将计算哪些运算符冷杉,后来,最后。可以使用 braces 更改实际顺序(大括号也是具有最高优先级的运算符)。

        编程语言中运算符的优先级关联性可以在其语言手册或规范中找到。

        【讨论】:

          猜你喜欢
          • 2020-12-03
          • 2020-10-20
          • 1970-01-01
          • 2013-09-30
          • 1970-01-01
          • 1970-01-01
          • 2014-06-27
          • 1970-01-01
          • 2022-01-26
          相关资源
          最近更新 更多