- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有一些代码对两个变量执行按位异或运算 (^
) 并将结果添加到第三个变量。
事实证明,以下两个语句会产生不同的结果:
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
应用于它们。
关于c++ - 异或两个变量并将结果添加到第三个变量适用于运算符 += 但不适用于运算符 = 和 + 组合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57729725/
COW 不是奶牛,是 Copy-On-Write 的缩写,这是一种是复制但也不完全是复制的技术。 一般来说复制就是创建出完全相同的两份,两份是独立的: 但是,有的时候复制这件事没多大必要
我是一名优秀的程序员,十分优秀!