在c+中正确使用过载电源+;? 在C++中,我实现了整数< /C>类,并且重载运算符> 为幂函数。< /P> integer integer::operator^ (const integer& rhs){ return integer(pow(this->.i, rhs.i)); }

在c+中正确使用过载电源+;? 在C++中,我实现了整数< /C>类,并且重载运算符> 为幂函数。< /P> integer integer::operator^ (const integer& rhs){ return integer(pow(this->.i, rhs.i)); },c++,operators,operator-overloading,xor,C++,Operators,Operator Overloading,Xor,这对于两个操作数都正常工作 integer i1, i2, i3 ; i4 = i1 ^ i2 ^ i3; i4的值在数学上是错误的,因为关联性要求从右到左。我怎样才能解决这个问题?如何更改关联性 我得到了合理的答案,我学到了: -We can't change associativity or priority of an operator. -Good is Not to overload operators to do something conceptually d

这对于两个操作数都正常工作

integer i1, i2, i3 ;   
 i4 = i1 ^ i2 ^ i3;  
i4
的值在数学上是错误的,因为关联性要求从右到左。我怎样才能解决这个问题?如何更改关联性

我得到了合理的答案,我学到了:

-We can't change  associativity or priority of an operator.   
-Good is Not to overload operators to do something conceptually different to 
 the built-in versions  
-Even compiler can't support; it hard to implement!  

<>不能通过重载来改变C++中运算符的关联性或优先级。这些规则被硬连接到语言语法中

C++标准称(<135.6,强调矿山):

操作员函数应为非静态成员函数或非成员函数,且具有 至少一个类型为类、类引用、枚举或类引用的参数 枚举无法更改运算符的优先级、分组或操作数。 为每种类型预先定义的运算符=、(一元)和(逗号)的含义可以更改[…]

^
运算符不仅左关联,而且左关联。幂运算符的正确优先级应该高于乘法(因此在本表中优先级为4或更高),但它的优先级为10——这意味着即使是加法和减法也要在它之前计算
1+2^3*4
将被解析为
(1+2)^(3*4)
,而数学上正确的幂运算符应解析为
1+(2^3)*4


如果一个操作符的关联性或优先级可以被修改,一个巨大的、巨大的语法混乱就会接踵而至。我的拙见是,您不应该试图使
^
操作符过载,以将其用作power操作符。我宁愿在课堂上做一个
power
方法。

-1:给我们看一些真正有价值的代码。我不是通灵者(没有人是通灵者),所以我看不出你对
操作符^
的定义是什么。即使你可以改变关联性(你不能),优先级也会令人困惑
a*b^c
将被解析为
(a*b)^c
。通常情况下,最好不要重载运算符来执行与内置版本在概念上不同的操作。@user1705796是的,您真的不想这样做。把“^”作为幂会混淆任何人用来表示“xor”(即,每个曾经的C++开发工具)。而且,这在“数学上”也没有错。左/右关联性不是一个数学属性(虽然关联性是-^顺便说一句,(a^b)^c!=a^(b^c)),但它只是一个约定。@user1705796:真的吗?你认为“但是Y-ve”是一种你可以在公共场合输入并期望人们容忍你的东西吗?如果你不能抽出五秒钟来键入一个英语句子,为什么我们要花五分钟来思考你的问题?在这种情况下,没有不明确的关联或优先级。@user1705796,这是因为只有在你使用链式运算符时,关联性才会生效。无论操作符是左关联的还是右关联的,只要使用一次都没有区别。当您连续多次使用它时会出现问题,例如
a^b^c
。使用左关联的
^
运算符,这将成为
(a^b)^c
。使用右关联运算符,它将变成
a^(b^c)
。这对于幂运算符来说是个问题,因为它是非交换的:您无法对操作数重新排序并获得相同的结果(例如,与加法或乘法运算符一样)。您可以始终在波兰语前缀表示法中使用该类,这将解决你在操作方面的问题。@zneak谢谢你的回答。我几乎完全理解作业中关于如何使操作员超负荷的内容,但我无法提高语言能力。非常感谢你的回答@Need4Sleep:对不起,我听不懂你说的话:(但是谢谢!…你能再补充一点吗。