异或两个变量并将结果添加到第三个变量适用于运算符 += 但不适用于运算符 = 和 + 组合使用

XORing two variables and adding the result to a third varibable works with operator += but not with operators = and + used in combination

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

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

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 The behavior of an expression of the form E1 op = E2 is equivalent to E1 = E1 op E2 except that E1 is evaluated only once. In += and -=, E1 shall either have arithmetic type or be a pointer to a possibly cv-qualified completely-defined object type. In all other cases, E1 shall have arithmetic type.

所以有两个表达式 E1E2 被求值,然后对它们应用二元运算符 op