C++ XOR 运算符优先级

C++ XOR operator precendence

本文关键字:优先级 运算符 XOR C++      更新时间:2023-10-16

所以我在这里感到困惑,确实: 是

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 的补码实现几乎不存在,但标准允许它们。

重要的是,在abc是整数的情况下,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; //1010c = 7; //0111a = 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)

这里没有运算符优先级。你的问题是关于关联性的,由于运算符是结合的,所以没有任何区别。