C或C++标准库中是否有逻辑(布尔)XOR函数?

13

我没有找到一个,但很难相信没有这样的内容。

2个回答

55

7
我不同意。表达式 1!=2 的计算结果为 true,但是 1 XOR 2 很明显是错误的,因为 1 和 2 都是 true。若要将 != 运算符用作 XOR 运算,您必须先进行 bool 强制类型转换。 - IanPudney
9
@quinxorin:那是无稽之谈。我问的是“逻辑”异或,1和2不是“逻辑”值。在C++中,“逻辑”意味着“bool”。 - Violet Giraffe
3
我似乎误解了你的问题。我没有意识到你所说的“逻辑异或”已经指代布尔值。 - IanPudney
1
我同意@IanPudney的观点。如果您知道两个值确切地是0或1(即逻辑值),为什么不使用"^"按位异或运算符呢?在相同条件下(当值不完全是0或1时),使用^或!=都会返回错误的结果。 - Bill Hollings
“^”是整数值的运算,而不是逻辑值。0 ^ 1返回一个int类型的值,这很好,但true ^ false也会返回一个int类型的值,这可能会引起问题。 ( true ^ false ) == true 可能会导致编译器警告/错误,因为它比较了一个int类型和一个bool类型。这就是为什么有一个&符号与&&符号不同的原因。为了保持一致性,应该有一个^^符号。 - goneskiing

5

如果您想要判断两个值是否相同,可以使用 != 或位运算符 ^。如果您的值已经是bool类型,则可以直接使用。但是,如果您的值不是纯粹的bool类型,请先将它们转换为bool类型:

((bool)myVal)!=((bool)myOtherVal)
((bool)myVal)^((bool)myOtherVal)
//either works

你确定第二个代码是正确的吗?标准是否规定所有评估为相同值的 bool 变量都是按位相等的? - Violet Giraffe
我不确定标准是什么;它在Windows上的MinGW中可以运行。 - IanPudney
那根本没有意义。 - Violet Giraffe
3
在布尔值上使用符号^会将它们转换为整数,标准规定true转换为1。这在4.5/6中有说明。 - Sebastian Redl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接