c++ - 异或两个变量并将结果添加到第三个变量可与运算符 += 一起使用,但不适用于运算符 = 和 + 组合使用
问题描述
我有一些代码对两个变量执行按位异或运算 ( ^
) 并将结果添加到第三个变量。
事实证明,以下两个语句会产生不同的结果:
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
应用于它们。
推荐阅读
- matlab - 使用一个命令从矩阵中获取特定点
- android - 房间数据库无此类表异常
- python-3.x - ImportError:/home/kei/darkflow/darkflow/cython_utils/cy_yolo_findboxes.so:未定义符号:_Py_ZeroStruct
- angular - Angular 6 - 使用“declare var require: any”是个坏主意吗?
- python - 网络爬虫无法处理多个网页
- ignite - 点燃服务器节点无法重新连接
- java - TimeLimitExceeded 提交时
- html - 角度应用程序将德语字符编码为乱码
- coronasdk - Corona sdk 使用额外参数调用 loadRemoteImage
- unity3d - 将 3d 对象与设备的陀螺仪统一对齐