之间的区别 |和 ||或 & 和 && 用于比较 [重复]

Posted

技术标签:

【中文标题】之间的区别 |和 ||或 & 和 && 用于比较 [重复]【英文标题】:Difference between | and || or & and && for comparison [duplicate] 【发布时间】:2010-11-19 17:40:15 【问题描述】:

可能重复:A clear, layman’s explanation of the difference between | and || in c# ?

与 | 比较有什么区别?和 ||还是 C# 和 javascript 中的 & 和 &&?

例子:

if(test == test1 | test1 == test2) or if(test == test1 || test1 == test2)
if(test == test1 & test1 == test2) or if(test == test1 && test1 == test2)

【问题讨论】:

你指的是什么语言? 找不到一个,但如果你能帮我找到一个,我将不胜感激 ***.com/questions/684648/… 复制:***.com/questions/35301/… @Michael 和@Mehrdad:链接的问题不包括 & 和 && 运算符,只有 |和||,所以我们不能凭良心将问题作为“完全”重复来结束,对吗? 【参考方案1】:

在 C(可能还有其他语言)中,单个 |& 是按位比较。 双 ||&& 是一个合乎逻辑的比较。编辑:请务必阅读下面 Mehrdad 关于“没有短路”的评论

实际上,由于true 通常等同于1false 通常等同于0,所以按位比较有时可能是有效的,并且返回完全相同的结果

我曾经在一个关键任务软件组件上运行静态代码分析器,它指出在应该进行逻辑比较的地方使用了按位比较。由于它是用 C 语言编写的,并且由于逻辑比较的安排,该软件与任何一个都可以正常工作。示例:

if ( (altitide > 10000) & (knots > 100) )
...

【讨论】:

在 C#(一种强类型语言)中使用 |布尔变量上的和 & 将导致“逻辑或/和无短路”。 哇,真的吗?这很有趣,我将不得不学习更多关于 C# 的知识。我将更新答案以指向您的评论。 Mehrdad 的评论实际上并不是 C# 独有的——许多(大多数?)强类型语言都有这种区别。我知道它存在于 Java 和 C++ 中,例如,我假设它存在于 C 中。 C# 行为的一个示例是“if ((o != null) & (o.Property == 1))”将抛出 NullReferenceException,因为它仍会尝试评估 o 的值。即使 o 为 null 的属性。 "if ((o != null) && (o.Property == 1))" 不会抛出异常,因为它不会尝试评估 o.Property if o == null。 @dustmachine:实际上,它确实有特殊的含义,因为运算符具有不同的行为,具体取决于操作数是整数类型还是 bool:msdn.microsoft.com/en-us/library/sbf85k1c.aspx:二进制 & 运算符是为整数类型和 bool 预定义。对于整数类型, & 计算其操作数的按位与。对于 bool 操作数,& 计算其操作数的逻辑与;也就是说,当且仅当其两个操作数都为 true 时,结果才为 true【参考方案2】:

&和|通常是按位运算。

&& 和 ||通常是逻辑运算。

出于比较目的,如果所有内容都返回 1 或 0,则完全没问题。否则,它可能会返回误报。您应该避免这种情况,以防止难以阅读的错误。

【讨论】:

【参考方案3】:

& 和 |是可以对整数和布尔参数以及 && 和 || 进行操作的位运算符是只能对布尔参数进行操作的逻辑运算符。在许多语言中,如果两个参数都是布尔值,关键区别在于如果第一个参数足以确定答案,逻辑运算符将执行短路评估而不评估第二个参数(例如,在 && 的情况下,如果第一个参数为假,第二个参数无关)。

【讨论】:

赞成第一个提到布尔运算符的短路【参考方案4】:

参考:

http://en.wikipedia.org/wiki/Short-circuit_evaluation

【讨论】:

【参考方案5】:

(假设 C、C++、Java、JavaScript)

|& 是位运算符,而 ||&& 是逻辑运算符。通常,您希望将||&& 用于 if 语句和循环等(即对于您上面的示例)。位运算符用于设置和检查位掩码中的位。

【讨论】:

【参考方案6】:

您使用单个字符(即 | 或 &)的实例是结果的按位比较。只要您的语言将这些表达式计算为二进制值,它们就应该返回相同的结果。但是,作为最佳实践,您应该使用逻辑运算符,因为这就是您的意思(我认为)。

【讨论】:

【参考方案7】:

& 和 |是二元运算符,而 ||和 && 是布尔值。

最大的不同: (1 & 2) 为 0,假 (1 && 2) 为真

【讨论】:

(1 && 2) 不是有效的 C# 语法。 原来的问题没有提到C#。它是在之后编辑的。

以上是关于之间的区别 |和 ||或 & 和 && 用于比较 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

& (&) 和 && or | 之间的区别(管道)和||在Objective-C中?

PV&UV&IP之间的区别和联系

VBA:&和+之间的区别

“#include&lt”和#include之间的区别[关闭]

&(*similarObject) 和similarObject 之间的区别?他们不一样吗?

C++指针和&Pointer之间的区别[重复]