|和||还是运营商?

2022-08-30 05:59:37

我一直在 OR 表达式中使用(两个管道),无论是在 C# 还是 PHP 中。偶尔我会看到使用单个管道:.这两种用法有什么区别?使用一个而不是另一个时是否有任何警告,或者它们是否可以互换?|||


答案 1

就像 和 运算符一样,双运算符是“短路”运算符。&&&

例如:

if(condition1 || condition2 || condition3)

如果条件 1 为真,则不会检查条件 2 和 3。

if(condition1 | condition2 | condition3)

这将检查条件 2 和 3,即使 1 已经为真。由于您的条件可能是非常昂贵的功能,因此您可以通过使用它们来获得良好的性能提升。

有一个很大的警告,NullReferences或类似的问题。例如:

if(class != null && class.someVar < 20)

如果类为 null,则 if 语句将在 is false 之后停止。如果你只使用&,它会尝试检查,你会得到一个不错的.对于Or-Operator来说,这可能不是一个陷阱,因为你不太可能触发一些不好的东西,但这是要记住的。class != nullclass.someVarNullReferenceException

但是,没有人会使用单个或运算符,除非您有一个设计,其中每个条件都是必须执行的函数。听起来像是一种设计气味,但有时(很少)这是一种干净的工作方式。运算符确实“运行这3个函数,如果其中一个函数返回false,则执行else块”,而“如果没有返回false,则仅运行else块” - 可能很有用,但如前所述,通常是设计气味。&|&|

不过,还有 and 运算符的第二种用法:按位运算|&


答案 2

||是逻辑 OR 运算符。听起来你基本上知道那是什么。它用于条件语句,如 if、while 等。

condition1 || condition2

如果任一条件 1 或条件 2 为真,则计算结果为 true。

|是按位 OR 运算符。它用于对两个数字进行操作。您单独查看每个数字的每个位,如果其中一个位是至少一个数字中的1,则结果位也将是1。以下是一些示例:

A = 01010101
B = 10101010
A | B = 11111111

A = 00000001
B = 00010000
A | B = 00010001

A = 10001011
B = 00101100

A | B = 10101111

希望这是有道理的。

因此,为了回答最后两个问题,我不会说除了“知道两个运算符之间的区别”之外还有什么警告。它们不可互换,因为它们做了两件完全不同的事情。


推荐