首页 > 解决方案 > 异或两个变量并将结果添加到第三个变量可与运算符 += 一起使用,但不适用于运算符 = 和 + 组合使用

问题描述

我有一些代码对两个变量执行按位异或运算 ( ^) 并将结果添加到第三个变量。

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

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

为什么呢?
编辑:我更改了问题以专门针对导致我的程序出现问题的问题。

标签: c++operatorsbitwise-operatorsoperator-precedence

解决方案


这个表达

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 应具有算术类型。

所以有两个表达式E1E2它们被评估,然后二进制运算符op应用于它们。


推荐阅读