为什么C++没有幂运算符? [已关闭]

问题描述 投票:0回答:4

许多语言都有幂运算符;为什么C++没有?例如,Fortran 和 Python 使用

**
,并且通常使用
^
编写(例如,在 LaTeX 中)。

c++ operator-keyword language-design
4个回答
55
投票

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++让事情保持原样,而这似乎并没有 造成任何问题。


10
投票

有两个原因

  1. 符号

    ^
    保留用于按位异或操作

  2. 您可以使用

    std::pow
    来实现相同的功能。

C++ 的好处是你可以重载

operator
来做任何你喜欢做的事!

template< typename T >
T operator^( T x, T y ) {
    return std::pow( x, y );
}

但是请考虑到,当您这样做时,其他认识

C++
但不认识您的人(我相信其中有不少人)可能会在理解您的代码时遇到重大问题!


1
投票

因为这是异或按位运算符。

有一些名为“pow”的函数可以做你想做的事情。


0
投票

如果你愿意,你可以帮助自己

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;
© www.soinside.com 2019 - 2024. All rights reserved.