C中的逻辑运算符有什么意义?

时间:2010-05-05 12:37:52

标签: c xor bitwise-operators logical-operators

我只是想知道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产生错误。然后我用&和|按位运算符和两者都给出了预期的结果。所有这些都是有道理的,因为知道真实条件具有非零值,而虚假条件具有零值。

我想知道,是否有理由使用逻辑&&和||当按位运算符&,|和^工作一样吗?

5 个答案:

答案 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,它没有任何问题。