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

Jor*_*dan 0 c++ matlab caret exponent

我目前正在将MATLAB代码重写为C++代码.只要键入"a ^ b"就能够将"a"提升到"b"的力量,这将使我的生活变得如此简单,因为这是在MATLAB中编写了多少原始代码.

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

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

提前致谢.

Jer*_*fin 7

虽然可能超载^来进行取幂,但你不应该这样做.这是个坏主意.

@AaronF的答案表明,执行此操作的代码是多么丑陋,但这只是冰山一角.当您尝试在实际代码中实际使用它时,真正的问题出现了.这些问题从一个简单的事实干:重载一个操作改变由操作者进行的操作,但并没有影响到任何的优先级,或者运营商的关联性.在这种情况下^,优先级关联性对于取幂都是完全错误的.

优先权

在C++中,^运算符具有相当低的优先级.指数应该有很高的优先权.例如,如果我有一个表达式x^y*z,我希望它意味着 - (x^y)*z但它真正意味着什么x^(y*z).事实上,^优先级甚至低于加法和减法,所以x^y+z出错了 - 它意味着x^(y+z)而不是(x^y)+z你想要的.

关联性

指数是正确的关联 - 但在C++中,^运算符是左关联的.例如,给出一个表达式x^y^z,你想要的是它意味着x^(y^z)什么,但你会得到什么(x^y)^z.

结果

这意味着如果你做超载operator^来进行取幂,你就只能使用这个名字了pow.你不会逃避大部分的括号; 在任何非平凡的表达式中,您仍然需要使用括号来强制执行正确的优先级和关联性,因为如上所述,C++赋予的优先级和关联性operator^对于取幂都是完全错误的.

结论

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

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