使用运算符+ =对两个变量进行异或运算并将结果添加到第三个变量中,但不能将运算符=和+结合使用

严重抑郁

我有一些代码^对两个变量执行按位XOR操作(),并将结果添加到第三个变量。

事实证明,以下两个语句产生不同的结果:

checksum += digit ^ (2 * checksum);               //correct result
checksum = checksum + digit ^ (2 * checksum);     //incorrect result

为什么?
编辑:我更改了问题,以专门针对引起程序问题的问题。

来自莫斯科的弗拉德

这个表达

checksum = checksum + digit ^ (2 * checksum);

被评估为

checksum = ( checksum + digit ) ^ (2 * checksum);

因为按位异或运算符^的优先级低于加法运算符+。

这个表达

checksum += digit ^ (2 * checksum);

被评估为

checksum = ( checksum ) + ( digit ^ (2 * checksum) );

那就是这个复合赋值运算符

checksum += digit ^ (2 * checksum);

计算表达式digit ^ (2 * checksum)并将其添加到的值checksum

根据C ++ 17标准(8.5.18赋值和复合赋值运算符)

7形式为E1 op = E2的表达式的行为与E1 = E1 op E2等效,只是E1仅被评估一次。在+ =和-=中,E1应该具有算术类型,或者是指向可能由cv限定的完全定义的对象类型的指针。在所有其他情况下,E1应具有算术类型。

所以有两个表达式E1,并E2正在评估,然后将二进制运算符op适用于他们。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章