常规 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
这些是所有计算机都使用的基本机器操作。
计算机喜欢它们,但大多数程序员更喜欢十进制算术和枚举。
这些运算符存在假设场景。如前所述,所有这些都涉及副作用。
想象一下,您有一个包含 username
、password
、confirmation
字段的网络注册表单。
您应该在 POST 之后验证用户的输入。您计划使用 returns bool
、f.e 的简单验证方法。 IsUsernameAvailable
、IsUsernameValid
、IsPasswordComplexEnough
和 ArePasswordAndConfirmationEquals
。所有这些方法都有一个包含错误消息的 input/output 参数 IList<string>
。
那么您的整个验证方法可能如下所示:
private bool ValidateAll(IList<string> errorMessages)
{
return IsUsernameAvailable(errorMessages)
| IsUsernameValid(errorMessages)
| IsPasswordComplexEnough(errorMessages)
| ArePasswordAndConfirmationEquals(errorMessages);
}
我正在查找 "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
这些是所有计算机都使用的基本机器操作。
计算机喜欢它们,但大多数程序员更喜欢十进制算术和枚举。
这些运算符存在假设场景。如前所述,所有这些都涉及副作用。
想象一下,您有一个包含 username
、password
、confirmation
字段的网络注册表单。
您应该在 POST 之后验证用户的输入。您计划使用 returns bool
、f.e 的简单验证方法。 IsUsernameAvailable
、IsUsernameValid
、IsPasswordComplexEnough
和 ArePasswordAndConfirmationEquals
。所有这些方法都有一个包含错误消息的 input/output 参数 IList<string>
。
那么您的整个验证方法可能如下所示:
private bool ValidateAll(IList<string> errorMessages)
{
return IsUsernameAvailable(errorMessages)
| IsUsernameValid(errorMessages)
| IsPasswordComplexEnough(errorMessages)
| ArePasswordAndConfirmationEquals(errorMessages);
}