C++ XOR 运算符优先级
C++ XOR operator precendence
所以我在这里感到困惑,确实: 是
a ^= b^c
相当于
a = a ^ (b ^ c)
还是a = (a ^ b) ^ c
?
任何短格式运算符:
LHS OP= RHS;
工作非常像:
LHS = LHS OP RHS;
正如评论中指出的那样,完成的评估数量等存在差异,因此,如果您在评估LHS
时开始产生副作用,这种简单的等价不再那么简单了。或同等学历。这就是为什么我重新措辞了上述内容,使其不那么铁板一块。
所以是前者,即a = a ^ (b ^ c)
.
C 和 C++"涵盖了很多方面,但举一个例子,C99 标准说 (6.5.16.2):
形式
E1 op= E2
的复合赋值不同于简单的赋值 赋值表达式仅E1 = E1 op (E2)
因为左值E1
仅评估一次。
在C++中,运算符重载意味着第一个表达式可能不等效于其他两个表达式,具体取决于操作数的类型。但对于内置复合运算符,相同的规则适用。C++03 说 (5.17/7):
表单
E1 op= E2
表达式的行为等效于E1 = E1 op E2
,除了E1
只评估一次。
请注意,只有 C 标准需要包含必要的括号来直接回答您的问题:它名义上是a ^ (b ^ c)
而不是(a ^ b) ^ c
。
但我认为我们可以假设,在C++标准在这里使用的特设类似 BNF 的语法语言中,像E2
这样的 BNF 非终端总是被认为是它出现的表达式的子表达式。因此,在具有从左到右关联性的情况下(以及所有具有复合赋值版本的运算符都从左到右关联),这会E2
拆分,使其不再是子表达式,我们必须在心理上插入足够的括号来防止这种情况。
实际上,对于 XOR 来说,这无关紧要,因为无论如何,值都是相同的,除非您在此过程中生成陷阱表示,这会导致错误。这可能发生在 C 或 C++ 的非 2 补码实现上,而这种情况的实现即使它愿意也无法a = (a^b)^c
计算a ^= b^c
。非 2 的补码实现几乎不存在,但标准允许它们。
重要的是,在a
、b
、c
是整数的情况下,a -= b - c
不等同于a = (a - b) - c
。除非c
等于0
.
想想异或真值表,试试看,这有什么关系吗?
x | y | XOR
-----------
0 | 0 | 0
1 | 0 | 1
0 | 1 | 1
1 | 1 | 0
所以如果你说b = 10; //1010
,c = 7; //0111
和a = 3; //0011
b ^ c = 1010 ^ 0111 = 1101
a ^ (b^c) = 0011 ^ 1101 = 1110 (14)
a ^ b = 0011 ^ 1010 = 1001
(a^b) ^c = 1001 ^ 0111 = 1110 (14)
给定您的特定示例,假设没有运算符重载,并且仅使用关联的 XOR 运算符......这并不重要。
不那么具体 首先应用^=
,因此:
a ^= b^c
相当于a = a ^ (b^c)
这里没有运算符优先级。你的问题是关于关联性的,由于运算符是结合的,所以没有任何区别。
- C++ 带有函数指针的运算符优先级
- <<运算符优先级与字符串比较
- 在一个指令中声明更多指针的运算符优先级
- C++逗号运算符的优先级
- 为什么括号在这种情况下无法更改c++运算符的优先级
- C++中的运算符优先级
- c++中的增量和三元运算符优先级
- 涉及模运算符优先级的错误以及C++中具有大数字的括号
- 带有 cout 和指针的运算符优先级
- C++ 使用矢量迭代器时的运算符优先级
- 好友与成员运算符重载的优先级
- 序列点和运算符优先级有什么区别
- 运算符优先级 括号问题
- C++表达式中的运算符优先级
- 相等运算符优先级不起作用
- 类构造函数比"="运算符具有更高的优先级?
- 为什么 C++ 中指向方法取消引用运算符的指针具有如此低的优先级
- 如何使用将 const int 的运算符用作 int* 优先级队列的比较器
- 递增和按位移位运算符优先级?
- C++,计算具有多个"&&"且没有较低优先级运算符的表达式