如何在C ++中使用Caret“^”进行指数化

时间:2014-06-28 04:27:53

标签: c++ matlab caret exponent

我目前正在将MATLAB代码重写为C ++代码。有能力提高" a"使用" b"只需输入" a ^ b"会让我的生活变得如此简单,因为这是在MATLAB中编写了多少原始代码。

有办法做到这一点吗? (我使用原始类型)

我很乐意接受一个不涉及括号和逗号的解决方案,如pow(a,b)方法。

提前致谢。

6 个答案:

答案 0 :(得分:7)

虽然 可以重载^来进行取幂,但你不应该。这是一个坏主意。

@ AaronF的回答显示,执行此操作的代码有多么丑陋,这只是冰山一角。当您尝试在实际代码中实际使用它时,会出现真正的问题。问题源于一个简单的事实:重载操作符会更改该操作符执行的操作,但会影响该操作符的优先级或关联性。在^的情况下,的优先级对于取幂都是完全错误的。

优先

在C ++中,^运算符的优先级非常低。指数应该有很高的优先权。例如,如果我有一个类似x^y*z的表达式,我希望表示(x^y)*z - 但它的真正含义是x^(y*z)。事实上,^的优先级甚至低于加法和减法,因此x^y+z出错了 - 这意味着x^(y+z)而不是您想要的(x^y)+z。< / p>

结合性

指数是正确的关联 - 但在C ++中,^运算符是左关联的。例如,如果给出x^y^z这样的表达式,那么想要的就意味着x^(y^z),但你得到的是(x^y)^z

结果

这意味着如果你重载operator^来进行取幂,你将只能使用名称pow。你将远离大部分括号;在任何非平凡的表达式中,您仍然需要使用括号来强制执行正确的优先级和关联性,因为如上所述,C ++分配给operator^的优先级和关联性对于取幂都是完全错误的。

结论

虽然可以重载operator^来进行取幂,但这是其中自由裁量权是更好的部分的地方之一。当您在C ++中重载运算符时,您确实需要考虑三个因素:名称,优先级和关联性。为了实现良好的操作员过载,这三个应该是正确的。进行超载有时是合理的,只有三分之二是正确的,而第三个并不太远。在这种情况下,三个中只有一个甚至接近右边;另外两个完全错误。

不要这样做。这是一个坏主意。

答案 1 :(得分:3)

以下工作,但您必须使用c ++ 11标准(g ++ -std = c ++ 11 * .cpp)进行编译: 您不能将XOR(^)运算符用于具有基元的指数。你必须在课堂上重载它。

#include <iostream>
#include <cmath>
#include <ctgmath>

using namespace std;

class Number {
private:
    float _num;
public:
    Number(float num) : _num(num){}
    Number operator^(const float& num) {
        return Number(pow(_num,num));
    }
    float get() {
        return _num;
    }
};

int main() {
    Number a = Number(5);
    Number b = a^7;
    cout << b.get();
}

答案 2 :(得分:2)

  • 对于原始类型(您的情况):

    在C和C ++中,^是按位XOR(异或)运算符。 您应该use std::pow将电话号码提升为电力。

  • 对于非原始类型,您可以重载operator^(但不鼓励这样做,因为您会违背此运算符的通常含义)

示例:

MyClass operator^(const MyClass& t1, const MyClass& t2)
{
    //return ...
}

答案 3 :(得分:1)

您不能为原始类型执行此操作。您需要使用std::pow。您可以通过重载^运算符来为用户定义的类型执行此操作,但这可能不是一个好主意,除非XOR对您的类型没有意义。

(在我说这个10分钟之后,有人会想出一个可怕的,可怕的黑客,用于具有用户定义类型的原始类型,隐式转换,用户定义的文字和重载的^运算符。)

答案 4 :(得分:0)

在cmath库中的pow()。有关

的更多信息

http://en.cppreference.com/w/cpp/numeric/math/pow

答案 5 :(得分:0)

好像你正在寻找有人说写一个^ b:D 你应该使用预定义的函数或写一个新函数;)