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

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

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

你不需要逻辑XOR,我已经忘记了SO问题,但它与你的想法类似,基本上我们不需要XOR,它相当于!=无论如何

 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 

我将搜索我的collections夹,然后在此处粘贴链接…

按位运算符与&&和||“不相同” 运营商。 首先,&&和|| 执行短路评估,而按位运算符则不执行。 换句话说,你不能用bitwise运算符做这样的事情:

 int * p = 0; (p != 0) && (*p = 1); 

因为如果你说:

 (p != 0) & (*p = 1); 

将评估两个子表达式,并且您将取消引用空指针。

当其操作数为整数值时,按位XOR不会像逻辑XOR那样工作:

 2^4 ? "Valid" : "Invalid" 

给出“有效”但应该给“无效”

在C参数中,逻辑运算符被视为布尔值 – 任何零都被视为“false”,其他任何东西(是的,负值)都是“true”。 按位运算处理单个位,正如Neil已经指出的那样,不像逻辑运算那样进行短路评估。

在您的示例中,结果完全有效且预期,因为两个之间的逐位xor为零。

如果你想在C中使用逻辑xor运算符,那么你可以使用:

 #define xor != 0 ^ !! 

它的工作原理是将表达式的两边都转换为布尔值并对它们进行xoring。 您可以像使用&&或||一样使用它,如下所示:

 if (a xor b) 

AFAICT,它没有任何问题。