优先级,关联性和顺序之间有什么区别?

时间:2008-09-16 09:37:24

标签: c# arithmetic-expressions

这种混乱的出现是因为大多数人都接受过根据PEDMAS or BODMAS rule评估算术表达式的训练,而像C#这样的编程语言中的算术表达式不能以相同的方式工作。

你对此有何看法?

3 个答案:

答案 0 :(得分:8)

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

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

订单是应用优先级关联性规则的结果,并说明如何评估表达式 - 将评估哪些运算符冷杉,后来,最后。可以使用大括号更改实际顺序(大括号也是具有最高优先级的运算符)。

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

答案 1 :(得分:2)

我不确定确实存在差异。传统的BODMAS(括号,顺序,除法,乘法,加法,减法)或PEDMAS(括号,指数,除法,乘法,加法,减法)只是所有可能操作的子集,并表示应该应用此类操作的顺序。我不知道任何违反BODMAS / PEDMAS规则的语言,但每种语言通常会添加其他各种操作符 - 例如++, - ,=等。

在出现混淆的情况下,我始终保持一个操作符优先级列表。然而,如果有疑问,通常值得使用一些括号来明确含义。请注意,括号没有最高优先级 - 请参阅http://msdn.microsoft.com/en-us/library/126fe14k.aspx以获取C ++中的示例。

答案 2 :(得分:2)

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

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

例如:

Precendences:

  1. <!/ LI>
  2. *,/
  3. +, -
  4. ==
  5. &安培;&安培;
  6. 术语:

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

    将按以下方式分组:

    1. !(person.isMarried)&amp;&amp; (person.age)== 25 + 2 * 5
    2. (!(person.isMarried))&amp;&amp; (person.age)== 25 + 2 * 5
    3. (!(person.isMarried))&amp;&amp; (person.age)== 25 +(2 * 5)
    4. (!(person.isMarried))&amp;&amp; (person.age)==(25 +(2 * 5))
    5. (!(person.isMarried))&amp;&amp; ((person.age)==(25 +(2 * 5)))
    6. ((!(person.isMarried))&amp;&amp;((person.age)==(25 +(2 * 5))))
    7. 一个非常常见的规则是*和/之前+和 - 。

      的优先级

      关联性指定对相同优先级的运算符进行分组的方向。大多数运营商都是从左到右。一元前缀运算符是从右到左。

      示例:

      1 + 2 + 3 + 4
      

      的分组如下:

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

        !! + 1

        分组为

        1. !!(+ 1)
        2. !(​​!(+ 1))
        3. (!(!(+ 1)))
        4. 到目前为止,一切都符合BODMAS / PEDMAS规则,您遇到的差异是什么?