C ++中的逻辑XOR运算符?
有这样的事吗? 这是我第一次遇到它的实际需求,但我没有看到在Stroustrup中列出的一个。 我打算写:
// Detect when exactly one of A,B is equal to five.
return (A==5) ^^ (B==5);
但是没有^^
操作符。 我可以在这里使用按位^
来获得正确的答案(不管机器表示的真假)? 我从不混合&
和&&
或|
和||
,所以我犹豫要用^
和^^
来做那个。
我会更自在地编写我自己的bool XOR(bool,bool)
函数。
!=
运算符为bool
值提供此目的。
对于真正的逻辑异或操作,这将起作用:
if(!A != !B) {
// code here
}
正确的手动逻辑XOR实现取决于您希望如何使用XOR模仿其他逻辑运算符( ||
和&&
)的一般行为。 关于这些运营商有两个重要的事情:1)他们保证短路评估,2)他们引入一个顺序点,3)他们只评估一次操作数。
如您所知,XOR评估不能被短路,因为结果总是取决于两个操作数。 所以1是没有问题的。 但是2呢? 如果你不关心2,那么使用规范化(即bool
)值运算符!=
根据结果执行XOR的工作。 操作数可以很容易地用一元规范化!
如有必要。 因此!A != !B
在这方面实现了正确的XOR。
但是,如果你在乎额外的序列点虽然没有!=
也不按位^
是实现XOR的正确方法。 正确执行XOR(a,b)的一种可能方式可能如下所示
a ? !b : b
这实际上与您可以使自制异或与||
相似 和&&
。 当然,如果您将XOR实现为宏,这只会起作用。 函数不会这样做,因为排序不适用于函数的参数。
有人可能会说,每个&&
和||
都有一个序列点的唯一原因 是为了支持短路评估,因此XOR不需要一个。 实际上这是有道理的。 然而,值得考虑的是在中间有一个序列点的XOR。 例如,下面的表达式
++x > 1 && x < 5
已经在C / C ++中定义了行为和特定的结果(至少在测序方面)。 所以,可以合理地期望用户定义的逻辑异或的相同,如在
XOR(++x > 1, x < 5)
而基于!=
的异或不具有此属性。
上一篇: Logical XOR operator in C++?
下一篇: Java singleton class vs JSF application scoped managed bean