|和||或操作符之间有什么区别?

我一直在OR表达式中使用||(两个管道),无论是在c#还是PHP中。我偶尔会看到一个管道被使用:|。这两种用法有什么区别?使用其中一种时有什么注意事项吗?或者它们是可以互换的吗?

189518 次浏览

一个是“按位或”。

10011b | 01000b => 11011b

另一种是逻辑或。

True或false => True

|操作符执行其两个操作数的逐位或运算(意味着两边都必须求值为false才能返回false),而||操作符只在需要时求值第二个操作符。

http://msdn.microsoft.com/en-us/library/kxszd0kx(VS.71).aspx

http://msdn.microsoft.com/en-us/library/6373h346(VS.71).aspx

单个管道“|”是“按位”或,应该只在知道自己在做什么的时候使用。双管“||”是一个逻辑或,可以在逻辑语句中使用,如“x == 0 || x == 1”。

这里有一个按位或的例子:如果a=0101和b=0011,那么|b=0111。如果您正在处理一个将任何非零视为真值的逻辑系统,那么按位或将以与逻辑或相同的方式工作,但其对应的(按位和,“&”)将不是。另外按位或不执行短路计算。

单个管道(|)是位或运算符

Two pipes(||)是逻辑或运算符。

它们是不可互换的。

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

condition1 || condition2

如果条件1或条件2为真,则返回true。

|是位或操作符。它用于对两个数运算。你单独看每个数字的每一位,如果其中一位至少在一个数字中是1,那么结果位也将是1。下面是一些例子:

A = 01010101
B = 10101010
A | B = 11111111


A = 00000001
B = 00010000
A | B = 00010001


A = 10001011
B = 00101100


A | B = 10101111

希望你们能理解。

所以为了回答最后两个问题,我不会说除了“知道两个运算符之间的区别”之外还有什么需要注意的。它们不能互换,因为它们做的是两种完全不同的事情。

就像&&&操作符一样,双操作符是一个“短路”操作符。

例如:

if(condition1 || condition2 || condition3)

如果条件1为真,条件2和条件3将不被检查。

if(condition1 | condition2 | condition3)

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

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

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

如果class为空,If语句将在class != null为false后停止。如果你只使用&,它将尝试检查class.someVar,你会得到一个漂亮的NullReferenceException。对于or -算子,这可能不是一个陷阱,因为你不太可能触发一些不好的事情,但这是要记住的事情。

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

|&操作符还有第二个用法:按位操作

好问题。这两个操作符在PHP和c#中工作相同。

|是一个按位或。它将比较两个值的位。例:1101 | 0010 = 1111。这在使用位选项时非常有用。例:读= 01 (0X01)写= 10 (0X02)读写= 11 (0X03)一个有用的例子是打开文件。一个简单的例子是:

File.Open(FileAccess.Read | FileAccess.Write);  //Gives read/write access to the file

||是一个逻辑或。这是大多数人思考OR的方式,并根据它们的真实性来比较两个值。例:我要去商店或者去购物中心。这是在代码中最常用的。例如:

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

单个管道|是操作符之一。

从维基百科:

在C编程语言家族中,按位的OR运算符是“|”(管道)。同样,此操作符不能与布尔“逻辑或”对应的操作符混淆,后者将其操作数视为布尔值,并且写为“||”(两个管道)。

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

根据数学定义,OR和and是二进制运算符;他们验证LHS和RHS条件,类似于|和&

||和&&当LHS条件不满足时,通过停止OR和and操作符来改变它们的属性。

,-(条件1 &条件2):检查两种情况,即使第一个是假的

< p >,,-(条件1 &&条件2):如果情况一,就不要费心去检查第二种情况

,,操作员将使您的代码运行更快,专业&很少使用

| -(条件1 |条件2):检查两种情况,即使情况1为真

|| -(条件1 ||条件2):如果先检查,就不麻烦检查第二种情况 一个是真

|| -操作符将使您的代码运行得更快,专业|很少使用

用于按位|和Logicall ||

&和逻辑&&

它表示 if( a>b | a==0) 在第一个左边a>b将被求值,然后a==0将被求值,然后|操作将被执行

但是在__abc0中,如果不检查下一个RHS

&和,,

if(A>0 & B>0)

它将计算LHS,然后RHS,然后按位进行&但

in(A>0 && B>0)

if(A>0)false(LHS),它将直接return false;