比较运算符 | 和 ||,& 和 && 之间的区别

36
"Possible Duplicate: 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)

你指的是哪种编程语言? - Michael Todd
找不到一个,但如果你能帮我找到一个,我会很感激。 - Josh Mein
3
这里是一个提问者询问 C 语言中 & 和 * 运算符区别的问题。& 运算符用于获取变量的内存地址,而 * 运算符用于获取指针所指向的值。简单来说,& 取地址,* 取值。 - Mehrdad Afshari
重复:https://dev59.com/AXVD5IYBdhLWcg3wQZYg - Michael Todd
@Michael 和 @Mehrdad:这些相关问题并没有包括 & 和 && 运算符,只有 | 和 ||,所以我们不能够诚信地将该问题关闭为“完全重复”,对吧? - Daniel Schaffer
https://dev59.com/U0jSa4cB1Zd3GeqPHrIB#1214651 - Ben Lesh
7个回答

32
在C语言(和其他语言中)单个的|&是按位比较。
双重||&&是逻辑比较。在实践中,由于true通常等同于1并且false通常等同于0,因此按位比较有时是有效的,并且可以返回完全相同的结果
曾经有一次,我对一个关键任务的软件组件运行了静态代码分析器,它指出使用了按位比较而应该使用逻辑比较。由于这是用C编写的,而且由于逻辑比较的排列方式,软件可以使用任何一种比较方式而不会出现问题。例如:
if ( (altitide > 10000) & (knots > 100) )
...

22
在C#中(这是一种强类型语言),对布尔变量使用 | 和 & 运算符会导致“逻辑或/与不带短路”。 - Mehrdad Afshari
哇,真的吗?那很有趣,我得学习更多关于C#的知识。我会更新答案并指向你的评论。 - dustmachine
9
C# 的一个例子是 "if ((o != null) & (o.Property == 1))",如果 o 是 null,它将抛出一个 NullReferenceException,因为它仍然会尝试评估 o.Property 的值。"if ((o != null) && (o.Property == 1))" 不会引发异常,因为如果 o == null,它不会尝试评估 o.Property。 - STW
1
@dustmachine:实际上,它确实有特殊的含义,因为运算符的行为取决于操作数是整数类型还是bool类型:http://msdn.microsoft.com/en-us/library/sbf85k1c.aspx :二进制&运算符对于整数类型和bool类型是预定义的。对于整数类型,&计算其操作数的按位AND。对于bool操作数,&计算其操作数的逻辑AND;也就是说,仅当其两个操作数都为true时,结果才为true - Grant Wagner
显示剩余5条评论

29

& 和 | 是按位运算符,可用于整数和布尔类型的参数,而 && 和 || 是逻辑运算符,只能用于布尔类型的参数。在很多语言中,如果两个参数都是布尔类型,则关键区别在于逻辑运算符将执行短路求值,并且如果第一个参数足以确定答案,就不会计算第二个参数(例如,在 && 的情况下,如果第一个参数为 false,则第二个参数无关紧要)。


5
因为首先提到布尔运算短路的内容而得到点赞。 - David

8

& 和 | 是二进制运算符,而 || 和 && 是布尔运算符。

它们的主要区别在于:
(1 & 2) 的结果是0,即false
(1 && 2) 的结果是true


3
(1 && 2)不是有效的C#语法。 - Chris Zwiryk
5
原始问题中没有提到 C#,之后编辑过。 - David

3
假设使用的是C、C++、Java或JavaScript语言,|&是按位运算符,而||&&是逻辑运算符。通常在if语句和循环等场合中要使用||&&(如上述例子)。按位运算符用于在位掩码(bitmasks)中设置和检查位。请注意保留HTML标记。

1

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



0

& 和 | 通常是位运算。

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

为了比较的目的,只要所有返回值都是1或0就可以了。否则,可能会出现误报。但是为了防止难以阅读的错误,应该尽量避免这种情况。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接