为什么求幂的优先级低于一元加减的优先级?

kva*_*our 8 bash ksh zsh operator-precedence language-lawyer

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

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

In [2]: -2**2
Out[1]: -4
Run Code Online (Sandbox Code Playgroud)

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

$ echo $((-2**1))
-2
$ echo $((-2**2))
4
Run Code Online (Sandbox Code Playgroud)

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

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

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


相关问题:

Ste*_*n C 6

根据维基百科,数学惯例是一元减号的优先级低于幂运算。一些编程语言遵循这一点,而另一些则不遵循。

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


你问:为什么?

嗯,在大多数情况下,为什么特定的语言设计者做出特定的选择并没有明确的理由;请参阅此问答的答案。然而,我们当然不能从理论的角度证明任何特定优先系统是“正确的”的立场。

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

  • 尽量与这种语言的祖先保持一致。
  • 尽量与感知的数学约定保持一致。
  • 做当时“感觉正确”的事情。

结果并不一致。

幸运的是:

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

  2. 求幂运算符不经常使用2,甚至不经常使用一元减号。

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


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

因此,为了与C相符合,bash的实现者需要把的运算符优先级**以上*/%与下面一元-。(**高于一元-与 C 的明确意图背道而驰......即一元-高于所有其他算术运算符。)


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


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

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