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

时间:2020-03-05 18:55:31  来源:igfitidea点击:

由于大多数人都受过训练以按照PEDMAS或者BODMAS规则评估算术表达式,而诸如Cdo这样的编程语言中的算术表达式却无法以相同的方式工作,因此产生了这种混淆。

我们对此有何看法?

解决方案

回答

我不确定真的有什么区别。传统的BODMAS(方括号,阶数,除法,乘法,加法,减法)或者PEDMAS(括号,指数,除法,乘法,加法,减法)只是所有可能操作的子集,并表示应将此类操作应用于我不知道违反BODMAS / PEDMAS规则的任何语言,但是每种语言通常都会添加各种其他运算符,例如++,-,=等。

在出现混乱的情况下,我总是会列出一系列运算符优先级。但是,如果有疑问,通常应该使用一些括号来使含义更清楚。请注意,括号没有最高优先级,有关C ++的示例,请参见http://msdn.microsoft.com/zh-cn/library/126fe14k.aspx。

回答

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

如果我们有一个不带括号的术语,请从优先级最低的运算符开始,然后将其括在括号中。

例如:

优势:

  • *,/
  • +,-
  • ==
  • &&

期限:

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

会像这样分组:

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

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

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

例子:

1 + 2 + 3 + 4

像这样分组:

  • (1 + 2)+ 3 + 4
  • ((1 + 2)+ 3)+ 4
  • ((((1 + 2)+ 3)+ 4)

尽管

!! + 1

分组为

  • !!(+ 1)
  • !(!(+ 1))
  • (!(!(+ 1)))

到目前为止,所有内容都符合BODMAS / PEDMAS规则,我们遇到了哪些不同?

回答

优先级规则指定运算符的优先级(将首先评估该运算符,例如,乘法比PEMDAS的优先级更高)。

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

该顺序是应用优先级和关联性规则的结果,并告诉表达式如何求值,哪个运算符将首先求值,哪个算符最后算。实际顺序可以通过使用花括号来更改(花括号也是具有最高优先级的运算符)。

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