我总是在OR表达式中使用||
(两个管道),包括C#和PHP。偶尔我会看到使用一个管道:|
。这两种用法有什么区别?当使用一个而不是另一个时是否有任何警告或者它们是否可以互换?
答案 0 :(得分:444)
就像&
和&&
运算符一样,双运算符是一个“短路”运算符。
例如:
if(condition1 || condition2 || condition3)
如果condition1为true,则不会检查条件2和3。
if(condition1 | condition2 | condition3)
这将检查条件2和3,即使1已经为真。由于你的条件可能是非常昂贵的功能,你可以通过使用它们来获得良好的性能提升。
有一个很大的警告,NullReferences或类似的问题。例如:
if(class != null && class.someVar < 20)
如果class为null,则if语句将在class != null
为false后停止。如果您只使用&amp;,则会尝试检查class.someVar
并获得一个不错的NullReferenceException
。使用Or-Operator可能不是那么多陷阱,因为你不太可能触发坏事,但这是要记住的事情。
除非你的设计中每个条件都是要执行的函数,否则没有人会使用单个&
或|
运算符。听起来像是一种设计气味,但有时(很少)这是一种干净的做事方式。 &
运算符执行“运行这三个函数,如果其中一个返回false,则执行else块”,而|
执行“只运行else块,如果没有返回false” - 可以是有用,但正如所说的,它通常是一种设计气味。
|
和&
运算符的第二次使用虽然:Bitwise Operations。
答案 1 :(得分:70)
||是逻辑OR运算符。听起来你基本上知道那是什么。它用于条件语句,例如if,while等。
condition1 || condition2
如果条件1或条件2为真,则求值为真。
|是按位OR运算符。它用于操作两个数字。您可以单独查看每个数字的每个位,如果其中一个位在至少一个数字中为1,那么结果位也将为1。以下是一些例子:
A = 01010101
B = 10101010
A | B = 11111111
A = 00000001
B = 00010000
A | B = 00010001
A = 10001011
B = 00101100
A | B = 10101111
希望这是有道理的。
所以为了回答最后两个问题,除了“了解两个运营商之间的区别”之外,我不会说任何警告。它们不可互换,因为它们做了两件完全不同的事情。
答案 2 :(得分:27)
一个是“按位或”。
10011b | 01000b =&gt; 11011B
另一个是逻辑或。
true或false =&gt;真
答案 3 :(得分:10)
好问题。这两个运算符在PHP和C#中的工作方式相同。
|是一个按位OR。它将比较两个值的位。例如。 1101 | 0010 = 1111.这在使用位选项时非常有用。例如。读= 01(0X01)写= 10(0X02)读写= 11(0X03)。一个有用的例子是打开文件。一个简单的例子是:
File.Open(FileAccess.Read | FileAccess.Write); //Gives read/write access to the file
||是一个逻辑OR。这是大多数人对OR的看法,并根据他们的真相比较两个值。例如。我要去商店,否则我会去商场。这是代码中最常用的一个。 E.g。
if(Name == "Admin" || Name == "Developer) { //allow access } //checks if name equals Admin OR Name equals Developer
PHP资源:http://us3.php.net/language.operators.bitwise
C#资源:http://msdn.microsoft.com/en-us/library/kxszd0kx(VS.71).aspx
http://msdn.microsoft.com/en-us/library/6373h346(VS.71).aspx
答案 4 :(得分:3)
java中的简单示例
public class Driver {
static int x;
static int y;
public static void main(String[] args)
throws Exception {
System.out.println("using double pipe");
if(setX() || setY())
{System.out.println("x = "+x);
System.out.println("y = "+y);
}
System.out.println("using single pipe");
if(setX() | setY())
{System.out.println("x = "+x);
System.out.println("y = "+y);
}
}
static boolean setX(){
x=5;
return true;
}
static boolean setY(){
y=5;
return true;
}
}
输出:
using double pipe
x = 5
y = 0
using single pipe
x = 5
y = 5
答案 5 :(得分:2)
&安培; - (条件1和条件2):检查两种情况,即使第一种情况为假
&安培;&安培; - (条件1&amp;&amp;条件2):如果是第一种情况,则不必费心去检查第二种情况 是假的
&安培;&安培; - 运营商将使您的代码更快,专业和更快地运行很少使用
| - (条件1 |条件2):即使案例1为真,也检查两种情况
|| - (条件1 ||条件2):如果是第一个,请不要再检查第二种情况 一个是真的
|| - 运营商将使您的代码在专业上更快地运行很少使用
答案 6 :(得分:0)
单个管道|是bitwise个运算符之一。
来自维基百科:
在C编程语言族中,按位OR运算符为“|” (管)。同样,不应将此运算符与其布尔“逻辑或”对应物混淆,后者将其操作数视为布尔值,并写为“||” (两个管道)。
答案 7 :(得分:0)
根据他们的数学定义,OR和AND是二元运算符;他们无论如何都要验证LHS和RHS条件,与|相似和&amp ;.
||和&amp;&amp;通过在LHS条件未满足时停止它们来改变OR和AND运算符的属性。
答案 8 :(得分:0)
对于按位let usersIdList = users
.filter(u => u.website == SOME_WEBSITE)
.map(u => u.id);
和Logicall const example = {
some: 'Some',
another: 'Another',
theOne: function() {
console.log(this.setTimeOut)
}.bind(global)
}
OR
按位|
和逻辑||
这意味着&
在这第一个左边的&&
中,将对 if( a>b | a==0)
进行评估,然后对a>b
进行操作
但是在a==0
中,则如果不检查下一个RHS
与&和&&
类似 |
它将先评估LHS,然后再评估RHS,然后按位进行&,但是
在|| if a>b
if(A>0 & B>0)
是(A>0 && B>0)
(LHS),它将直接if(A>0)
答案 9 :(得分:-1)
|运算符执行其两个操作数的按位OR(意味着双方必须求值为false才能返回false)而||如果需要,运营商只会评估第二个运营商。
http://msdn.microsoft.com/en-us/library/kxszd0kx(VS.71).aspx
http://msdn.microsoft.com/en-us/library/6373h346(VS.71).aspx
答案 10 :(得分:-1)
单管“|”是“按位”或只应在您知道自己在做什么时使用。双管“||”是逻辑的,或者可以在逻辑语句中使用,例如“x == 0 || x == 1”。
以下是按位或做的示例:如果a = 0101且b = 0011,则a | b = 0111。如果您正在处理将任何非零视为真的逻辑系统,则按位或将以与逻辑或相同的方式操作,但它的对应(按位和“&amp;”)将不会。也是按位或不执行短路评估。
答案 11 :(得分:-2)
答案 12 :(得分:-2)
|| (两个管道)通常是逻辑或while | (一个管道)是二进制或。在我的头脑中,我想不出任何时候差异将是一个大问题(除了你将结果分配给其他东西)。但是我相信其他人会有重要的情况。
编辑:哇,在我写这篇文章的时候还有其他六个答案。
答案 13 :(得分:-4)
按位(|)与逻辑(||)! 将逻辑视为Java中的Comparable对象,比较一些可区分的“部分”,而按位运算符查看这些对象,而不是看它们是否是视觉上的双胞胎(如逻辑确实),DNA样本并查看0和1的代替。