我只是想知道C中是否存在XOR逻辑运算符(类似于&& for AND但是对于XOR)。我知道我可以将XOR分成AND,NOT和OR,但简单的XOR会好得多。然后我想到如果我在两个条件之间使用普通的XOR位运算符,它可能会起作用。而且我的测试确实如此。
考虑:
int i = 3;
int j = 7;
int k = 8;
只是为了这个相当愚蠢的例子,如果我需要 k 大于 i 或大于 j 但不是两者,XOR都会非常方便。
if ((k > i) XOR (k > j))
printf("Valid");
else
printf("Invalid");
或
printf("%s",((k > i) XOR (k > j)) ? "Valid" : "Invalid");
我把按位XOR ^ 并产生“无效”。将两个比较的结果放在两个整数中导致2个整数包含1,因此XOR产生错误。然后我用&和|按位运算符和两者都给出了预期的结果。所有这些都是有道理的,因为知道真实条件具有非零值,而虚假条件具有零值。
我想知道,是否有理由使用逻辑&&和||当按位运算符&,|和^工作一样吗?
答案 0 :(得分:13)
你不需要逻辑XOR,我已经忘记了SO问题,但它与你的想法相似,基本上我们不需要XOR,它相当于!= 无论如何< / p>
FALSE XOR FALSE == FALSE
FALSE XOR TRUE == TRUE
TRUE XOR FALSE == TRUE
TRUE XOR TRUE == FALSE
FALSE != FALSE == FALSE
FALSE != TRUE == TRUE
TRUE != FALSE == TRUE
TRUE != TRUE == FALSE
我会搜索我的收藏夹,然后在此处粘贴链接...
答案 1 :(得分:11)
按位运算符与&amp;&amp;和&amp;&amp;和||运营商。首先,&amp;&amp;和||执行短路评估,而按位运算符则不执行。换句话说,你不能用位运算符做这样的事情:
int * p = 0;
(p != 0) && (*p = 1);
因为如果你说:
(p != 0) & (*p = 1);
将评估两个子表达式,并且您将取消引用空指针。
答案 2 :(得分:1)
当其操作数为整数值时,按位XOR不会像逻辑XOR那样工作:
2^4 ? "Valid" : "Invalid"
给出“有效”但应该给出“无效”
答案 3 :(得分:1)
在C参数中,逻辑运算符被视为布尔值 - 任何零都被视为“false”,其他任何东西(是的,负值)都是“true”。按位运算可以处理单个位,正如Neil已经指出的那样,不会受到逻辑运算的短路评估。
在您的示例中,结果完全有效并且是预期的,因为两个之间的逐位xor
为零。
答案 4 :(得分:1)
如果你想在C中使用逻辑xor运算符,那么你可以使用它:
#define xor != 0 ^ !!
它的工作原理是将表达式的两边都转换为布尔值并对它们进行xoring。 您可以像使用&amp;&amp ;;一样使用它。或者||,像这样:
if (a xor b)
AFAICT,它没有任何问题。