如何在C ++中使用插入符号“ ^”求幂

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

我目前正在将MATLAB代码重写为C ++代码。仅通过键入“ a ^ b”就能将“ a”提升为“ b”的能力,这将使我的生活变得更加轻松,因为这是用MATLAB编写的原始代码。

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

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

谢谢。

c++ matlab caret exponent
6个回答
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(); }


8
投票
虽然可以[[0]重载^以进行幂运算,但您不应该。这是个坏主意。

@ AaronF的答案显示了执行此操作的代码有多么丑陋,but

只是冰山一角。当您尝试在实际代码中实际使用

real问题时,就会出现此问题。问题源于一个简单的事实:重载运算符会更改该运算符执行的操作,但not不会影响该运算符的优先级或关联性。在^的情况下,两个优先级关联性对于幂运算都是完全错误的。优先级

在C ++中,^运算符的优先级很低。求幂应该具有很高的优先级。例如,如果我有一个类似x^y*z的表达式,我会

want

表示(x^y)*z,但是在C ++中它的真正含义是x^(y*z)。实际上,在C ++中,^的优先级甚至低于加法和减法,因此x^y+z出现错误-这意味着x^(y+z)而不是您想要的(x^y)+z

关联性

幂运算是右关联的-但是在C ++中,^运算符是左关联的。例如,给定类似x^y^z的表达式,您要

want

的意思是x^(y^z),但得到的却是(x^y)^z

结果

这意味着,如果您重载operator^进行幂运算,您将仅能使用名称pow。您将

not

摆脱大多数括号;在任何不平凡的表达式中,您仍然需要括号以强制使用适当的优先级和关联性,因为如上所述,C ++赋予operator^的优先级和关联性对于取幂都是完全错误的。

结论

尽管您

可以

重载operator^做幂运算,但这是那些谨慎决定勇气最好的地方之一。在C ++中重载运算符时,确实要考虑三个因素:名称,优先级和关联性。为了使操作员很好地过载,所有这三个都应该正确。有时在三分之二正确的情况下进行过载是很合理的,而第三分之差也不算太远。在这种情况下,只有三分之二甚至接近正确;其他两个错误是[[completely
错误。

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


2
投票
对于
    原始类型

2
投票

pow()在cmath库中。有关更多信息


0
投票
© www.soinside.com 2019 - 2024. All rights reserved.