我有一些代码^
对两个变量执行按位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] 删除。
我来说两句