异或两个变量并将结果添加到第三个变量适用于运算符 += 但不适用于运算符 = 和 + 组合使用
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.
所以有两个表达式 E1
和 E2
被求值,然后对它们应用二元运算符 op
。
我有一些代码对两个变量执行按位异或运算 (^
),并将结果添加到第三个变量。
事实证明,以下两个语句产生不同的结果:
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.
所以有两个表达式 E1
和 E2
被求值,然后对它们应用二元运算符 op
。