常规 OR (|) 和常规 AND (&) 运算符是否有实际用途

Is there a practical use for regular OR (|) and regular AND (&) operator

我正在查找 "csharp-station.com" 上的一些初学者课程,以复习我对 C# 的了解。对于 AND 和 OR 运算符,我一直使用“&&”和“||”像其他人一样。我什至不知道有一个版本。

表示如下:

关于或:"The primary difference between the two OR forms are that the regular OR operator will evaluate both sub-expressions every time. However, the conditional OR will evaluate the second sub-expression only if the first sub-expression evaluates to false."

关于和:"The difference between the two is that the regular AND operator will evaluate both expressions every time. However, the conditional AND operator will evaluate the second sub-expression only when the first sub-expression evaluates to true."

它的结论是:"The conditional operators (&& and ||) are commonly called short-circuit operators because they do not always evaluate the entire expression. Thus, they are also used to produce more efficient code by ignoring unnecessary logic."

就这些了吗?甚至有一个代码示例使用常规运算符更合理吗?我知道这个问题很简单,但我只是好奇。提前致谢。

正如你所说,这些运算符不会短路。但这还不是全部:它们用于位操作。一些例子:

设置第 4 位:

// 00000010 | 00001000 == 00001010
value = value | (1 << 3);

清除第 4 位:

// ~00001000 == 11110111
// 00001010 & 11110111 == 00000010
value = value & ~(1 << 3);

检查是否设置了第 4 位:

// 00001010 & 00001000 == 00001000
if ((value & (1 << 3)) != 0)
   ...

在 C# 中,这通常与标志枚举(应用了 [Flags] 属性的 enum 类型)一起使用。

这是框架中的示例:

[Flags]
public enum FileAttributes
{
    ReadOnly = 0x1,
    Hidden = 0x2,
    System = 0x4,
    Directory = 0x10,
    Archive = 0x20,
    Device = 0x40,
    Normal = 0x80,

    // and so on...
}

例如,您可以使用以下代码测试文件是否被隐藏:

if ((attributes & FileAttributes.Hidden) != 0)
    ...

主要区别在于表达式是否有副作用,以及您是否希望这些副作用始终发生

public bool A()
{
    Console.WriteLine("A");
    return true;
}

public bool B()
{
    Console.WriteLine("B");
    return false;
}

通过以上方法得到以下

if(A() || B())
    Console.WriteLine("A or B");

还有这个

if(A() | B())
    Console.WriteLine("A or B");

会打印出不同的结果。

尽管如此,依赖于这些副作用并不是一个好主意。因此,一般来说,非短路逻辑运算符的使用仅适用于被认为设计不佳的情况。因此,任何时候您发现需要使用它们时,很可能意味着代码设计存在缺陷。

但正如其他人提到的,&| 运算符也用于按位 "AND" 和 "OR",这与将它们与 [=15] 一起使用不同=] 表达式。

他们执行二进制(基数 2)计算。参见 bitwise operations

|  OR   
&  AND
^  XOR
~  NOT

这些是所有计算机都使用的基本机器操作。
计算机喜欢它们,但大多数程序员更喜欢十进制算术和枚举。

这些运算符存在假设场景。如前所述,所有这些都涉及副作用。

想象一下,您有一个包含 usernamepasswordconfirmation 字段的网络注册表单。

您应该在 POST 之后验证用户的输入。您计划使用 returns bool、f.e 的简单验证方法。 IsUsernameAvailableIsUsernameValidIsPasswordComplexEnoughArePasswordAndConfirmationEquals。所有这些方法都有一个包含错误消息的 input/output 参数 IList<string>

那么您的整个验证方法可能如下所示:

private bool ValidateAll(IList<string> errorMessages)
{
    return IsUsernameAvailable(errorMessages)
         | IsUsernameValid(errorMessages)
         | IsPasswordComplexEnough(errorMessages)
         | ArePasswordAndConfirmationEquals(errorMessages);
}