为什么C++没有幂运算符?

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

我正在上 C++ 课程,我注意到只有几个数学运算符可供使用。 我还注意到 C++ 的数学库中没有指数运算符。

为什么必须为此编写一个函数? C++ 的开发者有理由省略这个运算符吗?

c++ language-design exponential exponentiation
4个回答
59
投票

为此编写一个函数(当然,除非你疯了)。在 pow

 标头中定义了一个 
非常好的 <cmath>
 函数

旁白: 如果您尝试使用

^
作为强力操作符(正如某些人习惯的那样),您将会遇到令人讨厌的意外。它是异或 (XOR) 运算符(请参阅此处)。


16
投票

根据 Bjarne Stroustrup 在他的书 C++ 的设计和演化中的说法。他们决定避免指数运算符,因为:

  • 运算符提供了符号上的便利,但不提供任何新功能。代表科学/工程计算重度用户的工作组成员表示,运算符语法提供了较小的语法便利。
  • 每个 C++ 用户都必须学习这个新功能
  • 用户强调了用自己的专用求幂函数替换系统默认值的重要性,这对于内在运算符来说是不可能的
  • 该提案的动机不够充分。特别是,通过查看一个 30000 行的 Fortran 程序,我们无法得出该运算符将在 C++ 中广泛使用的结论
  • 该提案需要添加一个新的运算符并添加另一个优先级,从而增加了语言的复杂性

12
投票
当 C 语言被发明时,大多数 C 操作很容易被映射到单个处理器指令。当时,求幂不是机器指令,因此不是库例程。

Python 有

6
投票
运算符用于求幂。 在 C++ 中,您实际上可以通过一些技巧来定义这样的运算符。 通过将一元

*

 运算符与二元 
*
 运算符组合,如下所示:
#include <cmath>
#include <iostream>

struct Num {
    double value;

    Num(double value) : value(value) { }

    typedef Num* HalfStar;

    HalfStar operator*() const { return HalfStar(this); }
    Num operator*(const HalfStar& rhs) const
    {
        return Num(std::pow(value, rhs->value));
    }
    Num operator*(const Num& rhs) const
    {
        return Num(value * rhs.value);
    }

    friend std::ostream& operator<<(std::ostream& os, const Num& n)
    {
        return os << n.value;
    }
};

int main(int argc, char**argv)
{
    Num a = 10;
    Num b = 9;

    std::cout << "a*b = " << (a*b) << "\n";
    std::cout << "a**b = " << (a**b) << "\n";

    return 0;
}

但这不适用于非类类型,所以你不能这样做:
x**2

请参阅
此处

查看实例。

© www.soinside.com 2019 - 2024. All rights reserved.