5

这种混淆的出现是因为大多数人都被训练来根据PEDMAS 或 BODMAS 规则评估算术表达式,而像 C# 这样的编程语言中的算术表达式不能以相同的方式工作。

你对此有何看法?

4

3 回答 3

9

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

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

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

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

于 2008-09-16T10:01:02.353 回答
2

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

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

于 2008-09-16T09:55:35.253 回答
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 规则,您经历过哪些差异?

于 2008-09-16T09:57:03.767 回答