为什么C++没有幂运算符,而其他许多编程语言都有呢?例如Fortran和Python使用**
表示幂运算,在LaTeX中通常使用^
。
为什么C++没有幂运算符,而其他许多编程语言都有呢?例如Fortran和Python使用**
表示幂运算,在LaTeX中通常使用^
。
C++确实有一个幂运算符——它被写成pow(x, y)
。
最初,C语言的设计是考虑系统软件方面的,而且没有多少需要使用幂运算符的情况。(但它有按位运算符,如&
和|
,这在许多其他语言中都缺乏。)在C++标准化期间有一些讨论是否添加幂运算符,但最终的共识大致是:
不能使用^
,因为它的优先级是错误的(当然,2. ^ 8 == 256.
,但2 ^ 8 == 10
也不太好)。
不能使用**
,因为那会破坏现有程序(可能有类似x**p
的东西,其中x
是int
,p
是int*
)。
可以使用*^
,因为这个序列在C或C++中目前不合法。但这仍然需要引入额外的优先级。
C和C++已经有足够多的特殊标记和优先级水平,在与数字社区的讨论后,得出的结论是pow(x, y)
没有任何问题。
所以C++将事情留在原地,这似乎并没有引起任何问题。
**
没有歧义。如果b
不是指针,则a ** b
在乘法上下文中没有意义,但在指数运算的上下文中是有意义的。我唯一能想到的理由是,C/C++/C#社区认为科学编程不是真正的编程。这是一个重大的冒犯,也是Fortran程序员认为C/C++/C#是较差的科学编程语言的主要原因之一。 - David Hammenvector<vector<T>>
中用于最后一个>>
的方法。 但它们涉及到类型相关的分析,其中符号的类型修改了词法分析器的工作方式。 如果**
是一个合法的标记,那么最大贪婪规则将将a**b
分词为a
,**
,b
,而不管其实际含义。 - James Kanzepow(x, y)
不是一个问题。*^
没有被采用的原因之一(也许是主要原因)是因为我们找不到任何在科学界关心它的人。 - James Kanze符号 ^
用于进行按位异或操作
您可以使用 std::pow
来实现相同的功能。
operator
让它执行任何您希望的功能!template< typename T >
T operator^( T x, T y ) {
return std::pow( x, y );
}
然而,需要考虑到当您这样做时,那些了解C++
但不了解您(我相信有相当多的人)可能会显著地难以理解您的代码!
^
可以表示乘方,也可以选择其他符号来表示异或 :-) - juanchopanza如果你愿意,你可以自己帮助自己
struct DoubleMock
{
DoubleMock(double v){_v = v;}
double _v;
};
double operator^(DoubleMock x, DoubleMock y)
{
return pow(x._v,y._v);
}
double v = DoubleMock(2.0) ^ 2.0;
a + 2^n
)。 - Emilio Garavaglia
^
是异或运算符。 - Graham Borland