【问题标题】:Why doesn't C++ have a power operator? [closed]为什么 C++ 没有幂运算符? [关闭]
【发布时间】:2013-01-15 14:58:24
【问题描述】:

许多语言都有幂运算符;为什么没有 C++?例如,Fortran 和 Python 使用 **,并且通常使用 ^ 编写(例如在 LaTeX 中)。

【问题讨论】:

  • ^ 是 C 和 C++ 中的异或运算符。
  • 不一定是这个原因,但它在 C 中已经是异或(XOR),因此赋予它另一个含义会破坏与 C 的向后兼容性。
  • 可能是因为它没有映射到很多平台上的好指令。
  • 找到一个答案programmers.stackexchange.com/questions/54718/…(或至少与“操作员被占用”以外的其他答案重复)
  • @JamesKanze:这是 2013 年,而不是 1969 年(发明 C 的那一年)。认为基于 C 的语言家族仍应仅限于石器时代可用的语言是过时的想法。 C++ 不能将幂运算作为运算符是没有正当理由的。

标签: c++ operator-keyword


【解决方案1】:

因为这是排他或按位运算符。

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

【讨论】:

    【解决方案2】:

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

    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)
    【解决方案3】:

    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# 视为低级科学编程语言的主要原因之一。
    • @DavidHammen 有一些解决歧义的方法,就像在vector<vector<T>> 中用于最终>> 的方法一样。但它们涉及类型相关分析,其中符号类型会修改词法分析器的工作方式。如果** 是合法令牌,则最大咀嚼规则会将a**b 令牌化为a、**、b,无论如何。
    • @DavidHammen 委员会实际上与数字领域的一些专家讨论了这个问题,他们似乎并不认为拼写 power operator pow(x, y) 是个问题。原因之一(也许是主要原因)*^ 没有成功是因为我们在科学界找不到任何关心的人。
    • pow() 不是运算符。可以静态评估运算符。所以这不会编译: enum { val = pow(2, 10) };
    【解决方案4】:

    有两个原因

    1. 符号^保留用于按位异或operation

    2. 您可以使用std::pow 来实现相同的功能。

    C++ 的好处是你可以重载operator 来做任何你想做的事情!

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

    但是要考虑到,当你这样做时,其他认识 C++ 而不认识你的人(我相信其中有不少)可能会有 理解您的代码的重大问题!

    【讨论】:

    • 是的,但为什么呢? ^ 可能是电源,并且可以为 XOR 选择其他符号 :-)
    • @juanchopanza Fortran 使用 ** 作为电源。所以你是对的,“^ 被占用”并不是不作为运营商提供权力的真正理由
    • @juanchopanza:你真的经常使用权力,以至于它需要一个独立的运营商吗?
    • @juanchopanza 最初,C 是为或多或少的低级系统编程而设计的,其中 xor 比幂运算更频繁。之后,如果没有严重的向后兼容性问题,您将无法更改运算符。
    • @JamesKanze 现在这是一个答案,正是我希望得到的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-30
    • 2010-10-24
    • 2016-11-18
    • 2014-03-22
    • 2020-06-19
    • 2011-09-14
    相关资源
    最近更新 更多