为什么Scala中的“Int ^ Int”不是取幂? (它是什么?)

时间:2012-03-11 18:07:25

标签: scala

^总是被认为意味着取幂。但它并没有这样做。它究竟意味着什么,是否有任何Int成员函数进行取幂(除了math.pow)?

为什么这样定义?当所有其他语言赋予它最高优先级时,它的运算符优先级低于arithemetic操作。

3 个答案:

答案 0 :(得分:22)

嗯,“所有其他语言”是一个非常强烈的声明。

Scala中的

'^'来自Java(它来自C语言的一般附近),并且意味着按位异或。 并且它在各种其他语言中也被用作XOR,例如。在Python中。

答案 1 :(得分:20)

它是按位排他或。您可能从未使用C,C ++或Java开发过,或者...... 它是从它们继承而来的。我不知道如何定义它“应该”是什么,但肯定有一个很多的代码用这个含义编写。

Int(和RichInt)没有取幂运算符。

就优先级而言,它位于其他逻辑运算符的中间,它属于实际意义所属的位置(与指数相反)。

如果你真的想在限制范围内覆盖“^”的含义(我推荐的话),我认为你可以使用隐式参数从而获得您想要的高优先级。或者,更加理智,我认为您可以以相同的方式定义“to_the”或“**”运算符,获得相同的高优先级。

答案 2 :(得分:0)

许多语言都有某种取幂运算符:R,Matlab,BASIC,LaTeX和UNIX的bc使用'3 ^ 2',Ada,COBOL,PL / I,Python和Fortran使用'3 ** 2'。< / p>

我已经看到它声称取幂是相对罕见的,但我会说在多年的编程中我从来不需要XOR而且已经很多年了,因为我需要任何类型的位操作 - - 可能回到他们以KB为单位测量RAM的日子。另一方面,我经常进行取词。

在我看来,如果我打算将Scala用作我的R,我可能会考虑这样的事情:

implicit class FixPow(x: Double) { def ~^(p: Double): Double = Math.pow(x, p) }

这有点难看,但确实比'*'具有更高的优先级,这就是所需要的。所以'3 * 2~ ^ 3'评估为24,正如预期的那样。

C对全套位操作的支持来自UNIX用C语言编写的事实。它基本上编写了汇编语言模式。