Difference between | and || or & and && for comparison
Possible Duplicate:
A clear, layman’s explanation of the difference between | and || in c# ?
与C和JavaScript中的和或&;和&;&;相比有什么区别?
实例:
1 2
| if(test == test1 | test1 == test2) or if(test == test1 || test1 == test2)
if(test == test1 & test1 == test2) or if(test == test1 && test1 == test2) |
- 哪种语言?
- 你指的是什么语言?
- C和JavaScript
- 找不到,但如果你能帮我找一个,我会很感激的
- stackoverflow.com/questions/684648/…
- dupe:stackoverflow.com/questions/35301/…
- @Michael和@Mehrdad:链接的问题不包括&;和&;operators,只包括和,因此我们无法本着良心将问题作为"精确"副本关闭,可以吗?
- "斯波兹不是……
- stackoverflow.com/questions/1214629/or-ing-bytes-in-c-gives-‌&8203;int/…
在C语言(可能还有其他语言)中,单个|或&是按位比较。双||或&&是一个逻辑比较。编辑:请务必阅读下面Mehrdad关于"无短路"的评论。
实际上,由于true通常等同于1,false通常等同于0,因此逐位比较有时是有效的,返回的结果完全相同。
有一次,我在一个关键任务软件组件上运行了一个静态代码分析器,它指出在应该进行逻辑比较的地方使用了位比较。由于它是用C语言编写的,并且由于逻辑比较的安排,所以该软件可以很好地处理这两种情况。例子:
1 2
| if ( (altitide > 10000) & (knots > 100) )
... |
- 在C(强类型语言)中,对布尔变量使用和&;将导致"逻辑或/和w/o短路"。
- 哇,真的吗?这很有趣,我还得进一步了解C。我会更新答案,指向你的评论。
- Mehrdad的评论实际上并不是C——很多(大多数?)所独有的。强类型语言有这种区别。我知道它存在于爪哇和C++,并且我假设它在C中存在。
- C行为的一个例子是"if"(o!=null)&;(o.property==1))"将引发NullReferenceException,因为即使o为null,它仍将尝试计算o.property的值。"如果(o)!=null)&;&;(o.property==1))"不会引发异常,因为如果o==null,它不会尝试计算o.property。
- 我的意思是说"…如果o为空,将抛出NullReferenceException…"
- 啊,这当然有道理。因为&;表示我们正在尝试执行逐位"和"运算,所以我们必须对所有内容进行评估,否则就没有任何内容可以执行逐位"和"运算。灯泡亮了。所以它不是有特殊的含义,比如"不短路",而是要执行所有的条件,才能完成按位运算的任务。
- @约德:我希望没有人真的用&和|在生产代码中做逻辑和/或w/o短路。我认为有人会使用它们的唯一原因是为了确保表达式的副作用总是发生。似乎…非常糟糕。
- @dustmachine:实际上,它确实有特殊意义,因为操作员的行为取决于操作数是整型还是bool:msdn.microsoft.com/en-us/library/sbf85k1c.aspx:binary&;operators是为整型和bool预定义的。对于整数类型,&;计算其操作数的位和。对于布尔操作数,&;计算其操作数的逻辑与;也就是说,如果且仅当两个操作数都为真,则结果为真。
- 对不起,这不是答案。
- msdn.microsoft.com/en-us/library/sbf85k1c.aspx上的页面指出,"无论第一个运算符的值如何,&operator都会对两个运算符进行评估。",这似乎包含了布尔值预定义的运算符。但是,C语言规范并未在第7.11.3节中作出保证。
&;和是可以对整数和布尔参数同时操作的位运算符,&;和是只能对布尔参数操作的逻辑运算符。在许多语言中,如果这两个参数都是布尔值,则关键区别在于逻辑运算符将执行短路评估,如果第一个参数足以确定答案,则不评估第二个参数(例如,在&;&;的情况下,如果第一个参数为假,则第二个参数不相关)。
&;和是二进制运算符,而和&;是布尔运算符。
最大的区别是:(1&2)为0,错误(1&2)是正确的
- (1&;2)不是有效的C语法。
- 最初的问题没有提到C。它是在之后编辑的。
(假设C、C++、Java、JavaScript)
|和&是位运算符,||和&&是逻辑运算符。通常,您希望将||和&&用于if语句和循环等(即上面的示例)。位运算符用于设置和检查位掩码中的位。
参考文献:
http://en.wikipedia.org/wiki/short-circuitu评估
使用单个字符(即或&;)的实例是结果的按位比较。只要您的语言将这些表达式计算为二进制值,它们就应该返回相同的结果。但是,作为最佳实践,您应该使用逻辑运算符,因为这就是您的意思(我认为)。
&;和通常是按位操作。
其中as&;&;和通常是逻辑操作。
为了进行比较,如果所有的返回都是1或0,那就非常好了。否则,它会返回误报。不过,您应该避免这种情况,以防止难以阅读的错误。