我总是在OR表达式中使用||(两个管道),无论是在c#还是PHP中。我偶尔会看到使用单个管道:|。这两种用法有什么区别?使用其中一种时有什么注意事项吗?或者它们是可以互换的吗?
当前回答
好问题。这两个操作符在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
其他回答
一个是“按位或”。
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
根据数学定义,OR和and是二进制运算符;他们会验证LHS和RHS条件,类似于|和&。
||和&&通过在LHS条件未满足时停止它们来改变OR和and运算符的属性。
单个管道“|”是“按位”或,应该只在知道自己在做什么的时候使用。双管“||”是一个逻辑或,可以在逻辑语句中使用,如“x == 0 || x == 1”。
这里有一个按位或的例子:如果a=0101和b=0011,那么|b=0111。如果您正在处理一个将任何非零视为真值的逻辑系统,那么按位或将以与逻辑或相同的方式起作用,但其对应的(按位和,“&”)将不是。另外按位或不执行短路计算。
就像&和&&操作符一样,双操作符是一个“短路”操作符。
例如:
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后停止。如果你只使用&,它将尝试检查类。someVar,你得到一个NullReferenceException。对于or -算子,这可能不是一个陷阱,因为你不太可能触发一些不好的事情,但这是要记住的事情。
但是,没有人会使用单个的&或|操作符,除非在设计中,每个条件都是必须执行的函数。听起来像是一种设计的味道,但有时(很少)这是一种干净的做事方式。&操作符“运行这3个函数,如果其中一个返回false,则执行else块”,而|“如果没有返回false,则只运行else块”——可能很有用,但如前所述,这通常是一种设计味道。
|和&运算符还有第二种用法:位操作。
推荐文章
- Task和Task的区别是什么?启动/等待和异步/等待?
- 如何实现规则引擎?
- 该类型必须是引用类型,以便在泛型类型或方法中使用它作为参数'T'
- 将字符串数组转换为字符串
- 如何将linq结果转换为哈希集或哈希集
- 通用 TryParse
- 使用PHP加密和解密密码的最佳方法是什么?
- HTTP POST返回错误:417“期望失败。”
- 如何实现一个好的脏话过滤器?
- 如何在。net中创建和使用资源
- 为什么Path。以Path.DirectorySeparatorChar开头的文件名合并不正确?
- PHP中的三个点(…)是什么意思?
- Guzzlehttp -如何从guzzle6得到响应的正文?
- 如何在c#中获得正确的时间戳
- 移动一个文件到服务器上的另一个文件夹