【问题标题】:Why is the precedence of exponentiation lower than that of unary plus minus?为什么求幂的优先级低于一元加减的优先级?
【发布时间】:2023-11-27 07:16:01
【问题描述】:

Fortran、Python、Ruby、Perl、Awk 等大多数语言都将求幂运算符的优先级定义为高于一元加号和减号的优先级。这会产生以下结果:

In [1]: -2**1
Out[1]: -2

In [2]: -2**2
Out[1]: -4

诸如 Ksh、bash、zsh 之类的 Shell 将这两个运算符的优先级颠倒。这导致了令人惊讶的结果:

$ echo $((-2**1))
-2
$ echo $((-2**2))
4

问题:为什么 shell 有这种特殊的优先顺序?我认为这是基于家谱的ksh > bash > zsh。但还是..

注意:求幂不是 POSIX 的一部分

注意:其他语言/解释器存在类似的优先顺序,例如bctcl


相关问题:

【问题讨论】:

  • Awk 的 ^ 也比一元 -/+ 具有更高的优先级
  • @oguzismail 是的,我已将其添加到列表中。可能有更多的语言适合该图片,因为它符合书面数学中使用的优先级。那些贝壳似乎是奇怪的鸭子。
  • 值得注意的是,书面数学中的一元减号与 Python 中的行为相同。 en.wikipedia.org/wiki/Order_of_operations#Unary_minus_sign
  • @oguzismail 你似乎删除了关于bc 的评论,我只是想读它:(
  • @user1934428 同意。有什么地方可以推荐吗? Retrocomputing Software Engineering Unix & Linux ... ?

标签: bash language-lawyer zsh ksh operator-precedence


【解决方案1】:

根据Wikipedia,数学约定是一元减号的优先级低于求幂。有些编程语言遵循这一点,有些则没有。

但上述文章也给出了科学出版物中使用的数学符号的不同约定的示例1;例如不同的乘法和除法书写方式的优先级。


你问:为什么?

嗯,在大多数情况下,特定语言设计者为何做出特定选择并没有明确的理由;查看this Q&A 的答案。但是,我们当然不能证明任何特定的优先系统从理论上来说都是“正确的”。

一般来说,PL 优先系统的指导原则似乎是:

  • 尽量与该语言的祖先保持一致。
  • 尽量与感知到的数学惯例保持一致。
  • 做当时“感觉正确”的事情。

结果不一致。

幸运的是:

  1. 人们往往习惯于他们大部分时间使用的语言的怪癖,并且

  2. 求幂运算符不经常使用2,更不用说一元减号了。

所以通常没关系。 (除非有人在具有巨大影响/后果的环境中弄错了。即便如此,也应该有流程来处理人为错误。)


bash 中表达式求值的运算符优先级记录为基于 C 运算符优先级。 (请参阅man bash。)C 没有幂运算符,但它确实使一元 +- 的优先级高于乘法和除法。

因此,为了与 C 保持一致,bash 实现者需要将 ** 的运算符优先级置于 */% 之上,并低于一元 -。 (将 ** 置于一元 - 之上违背了 C 的明确意图......即一元 - 高于所有其他算术运算符。)


如果您真正的问题不是“他们为什么这样做”而是“原因是否已记录在案”,您可能需要在开发人员邮件列表、源代码存储库等中寻找线索。或者尝试询问设计师……尽管他们可能不记得准确的原因。


1 - 如果数学家不能在符号上保持一致,为什么编程语言设计者也不能保持一致?

2 - 事实上,许多编程语言甚至不支持指数运算符。

【讨论】:

    最近更新 更多