为什么语言具有运算符优先级?

时间:2013-06-17 18:53:18

标签: operator-precedence

为什么不简单地评估从左到右?有人可以解释优先级如何使代码更具可读性?对我而言似乎需要更多的思考和更多的错误可能性。爱因斯坦说:“一切都应尽可能简单,但不能简单。”我猜他不是程序员。

8 个答案:

答案 0 :(得分:5)

因为在数学中,在任何计算机语言的发明之前,都有运算符优先权,例如

2 + 5 * 3 = 17 (and not 21)

*运算符优先级高于+运算符的语言会产生混淆。

C ++的另一个例子:

std::cout << 7 * 8 << std::endl;

如果*运算符没有<<运算符的优先级,则无法编译:

  • std::cout << 7将首先评估,结果会产生std::cout(副作用会打印7
  • 然后人们会想要评估std::cout * 8 - 除非有人定义了一个非常奇怪的运算符*,用于将outputstream乘以整数 - 未定义。

运算符优先级允许不必在常识中放置不必要的括号(尽管我同意在某些情况下人们会引入错误,因为他们不知道实际的优先级)


现在你可能会问:为什么数学有运算符优先权? This wikipedia article提到了一些历史事实和a discussion forum的链接。对我来说,一个重要的论点就是在写多项式时,例如

ax^2 + bx + c 

没有运算符优先级,必须将它们写为:

(a(x^2)) + (bx) + c

答案 1 :(得分:2)

优先权的目的不是为了使其更具可读性,而是为了(a)标准化和(b)与数学中设定的标准保持一致,例如PEMDAS。

答案 2 :(得分:2)

APL没有运算符优先级(括号除外);代码从右到左阅读(如希伯来语或阿拉伯语)。也就是说,APL是一种利基语言,这也是其中一个原因。大多数其他语言,正如其他答案已经指出的那样,模仿了长期建立的算术优先级规则,而这在我看来是由于典型用例(即现实世界问题)如何用最小数量的模型来建模的。括号中。

答案 3 :(得分:1)

数字世界只是遵循BEDMAS规则的老派“真实”世界:括号,指数,除法,乘法,加法,减法。

更好地追随现实世界,而不是试图重新定义现实并最终与程序员一起做

1 + 2 * 3

as

(1 + 2) * 3 = 9

v.s。一个真正的工作者

1 + (2 * 3) = 7

并将数百万美元的探测器发送到无效的大气下降情况,因为某人“误拿了1”。

答案 4 :(得分:1)

可以取消优先级规则 - 或者更准确地说,只有一条这样的规则 - 如APL所示。

  

“它只有一个简单,一致和递归的优先规则:函数的右参数是该函数右侧整个表达式的结果。”

例如,在“J”(APL变体)中:

  1+2*3   => 7      Computed as  1+(2*3)
  2*3+1   => 8      Computed as  2*(3+1)

APL(和J)拥有如此多的运营商,很难记住每一个运营商的优先级和关联性规则。

答案 5 :(得分:1)

存在运算符优先级的原因是因为您应该看到像2*4这样的总和作为整数。

所以你可以用2*4不存在的方式来思考它。它只是8

所以你基本上做的是“简化”总和,例如:2+10*2这基本上说:2+20

如以下总和:2143+8^2+6^9。你不想写出2143+262144+10077696。 (想象一下如果你有一个更大的公式,这会是怎样的)

这基本上是为了简化总和的外观。加法和减法都是最基本的操作形式。这就是为什么有一个优先权,它是为了增加总和的可读性。

就像我说的那样,由于+-运算符是最基本的运算符,因此首先解决更“复杂”的运算符是有意义的。

答案 6 :(得分:0)

例如,对于运算符优先级,以下评估为 14

2 + 3 * 4

没有它会评估 20 ,这是意料之外的,imho。

答案 7 :(得分:0)

举个例子,如果没有运算符优先级,你将如何评估这个表达式:

1+2/3

好吧,有些人会说你要将1+2的总和除以3。您要将2/3添加到1的其他人!