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)

而基于!=的异或不具有此属性。

链接地址: http://www.djcxy.com/p/58233.html

上一篇: Logical XOR operator in C++?

下一篇: Java singleton class vs JSF application scoped managed bean