显示XOR语句的优雅方式是什么?

时间:2014-01-15 07:53:54

标签: c# java c syntax

确保条件符合条件的简洁(可读!)方式是什么:

If a is true, then run code.

If b is true, then run code.

If both a and b is true, then do NOT run code.

一种方法是嵌套:

if (a || b)
{
    if(!(a && b))
    {
         //Code
    }
}

这很冗长,但也许更容易传达意图?

我们可以通过以下方式缩短它:

if((a||b) && (!a&&b))

但这有点神秘,特别是如果变量名很长。

我错过了什么吗?是否有更好的方法来编写上述内容?

7 个答案:

答案 0 :(得分:9)

您可以像其他人建议的那样使用^,但要小心,因为它也是按位独占或。关于它何时用于按位以及何时用于逻辑的确切行为因语言和数据类型而异。

例如在Java中确保A和B是布尔类型,你会没事的。

在c中,如果您使用了整数ij;

if (i ^ j) {
}

然后它将在i和j上执行按位xor,然后如果结果为0,则结果将被处理为false,否则为true。

在Java中,由于表达式的结果不是布尔值,因此会出现语法错误。

一些有效的替代方案:

C / C ++:

(!i ^ !j) 
// The ! converts i to boolean.
// It also negates the value but you don't need to reverse it back as you are comparing the relative values

C#/ Java的:

(A ^ B)
// Make sure A or B are boolean expressions, you will get a compile time error if they are not though.

答案 1 :(得分:5)

如果我理解正确,您所寻找的是Exclusive-Or运算符^

http://msdn.microsoft.com/en-us/library/zkacc7k1.aspx

干杯

答案 2 :(得分:4)

“A或B但不是两者”是独家或。你可以把它写成

if (A ^ B) {
    ...
}

您可能还注意到它等同于“A和B不同”,您可以使用!=运算符编写:

if (A != B) {
    ...
}

对于布尔值和0/1值,这是完全等效的,有时可能更清晰。

答案 3 :(得分:3)

看来,你想要 XOR (eXclusive OR - a或b,但不是a和b):

  if (a ^ b) {
    ...
  }

答案 4 :(得分:1)

  

如果a为true,则运行代码。   如果b为true,则运行代码。   如果a和b都为真,那么不要运行代码。

这不是NAND - 这是XOR^ is the XOR operator

        // When one operand is true and the other is false, exclusive-OR  
        // returns True.
        Console.WriteLine(true ^ false);
        // When both operands are false, exclusive-OR returns False.
        Console.WriteLine(false ^ false);
        // When both operands are true, exclusive-OR returns False.
        Console.WriteLine(true ^ true);

答案 5 :(得分:0)

你需要A和B为布尔值。 以下是实现NAND的代码:

void main(void)
{
    bool a=true, b=false;
    if(!(a & b))
    cout<<"NAND";
}

答案 6 :(得分:0)

NAND只是AND的否定,而当AND为假时,则为真,即:  a或b(或两者)都是假的。

在C中 只需使用!(a&amp;&amp; b)

即可获得NAND

我不确定C#

中是否属于这种情况