|之间有什么区别? 和|| 或运营商?
我一直使用||
(两个pipe道)在ORexpression式,在C#和PHP。 有时我会看到使用一个pipe道: |
。 这两种用法有什么区别? 在使用一个之前是否有任何警告或可以互换?
就像&
和&&
操作符一样,双操作符是一个“短路”操作符。
例如:
if(condition1 || condition2 || condition3)
如果条件1为真,条件2和3将不被检查。
if(condition1 | condition2 | condition3)
这将检查条件2和3,即使1已经为真。 由于你的条件可能是相当昂贵的function,你可以通过使用它们获得很好的性能提升。
有一个大的警告,NullReferences或类似的问题。 例如:
if(class != null && class.someVar < 20)
如果class为null,那么if语句将在class != null
为false后停止。 如果你只使用&,它会尝试检查class.someVar,你会得到一个不错的NullReferenceException
。 “或运算符”可能不是一个很大的陷阱,因为它不太可能引发一些不好的事情,但是要牢记这一点。
没有人使用单一的&
或|
运算符,除非你有一个devise,每个条件是一个函数,要执行。 听起来像devise的气味,但有时(很less)这是一个干净的方式来做东西。 &
运算符“运行这3个函数,如果其中一个返回false,则执行else块”,而|
“如果没有返回false,只运行else块” – 可以是有用的,但正如所说的那样,通常它是一种devise气味。
有|
的第二个用法 和&
运算符: 按位运算 。
|| 是逻辑OR运算符。 这听起来像你基本上知道那是什么。 它用于条件语句,如if,while等
condition1 || condition2
如果条件1或条件2为真,则评估为真。
| 是按位或运算符。 它用来操作两个数字。 您可以分别查看每个数字的每一位,如果其中至less一个数字中有一位是1,则结果位也是1。 这里有几个例子:
A = 01010101 B = 10101010 A | B = 11111111 A = 00000001 B = 00010000 A | B = 00010001 A = 10001011 B = 00101100 A | B = 10101111
希望这是有道理的。
所以回答最后两个问题,除了“知道两个运营商之间的区别”之外,我不会说有什么警告。 他们不可互换,因为他们做了两件完全不同的事情。
一个是“按位”。
10011b | 01000b => 11011b
另一种是逻辑或。
true或false => true
好问题。 这两个操作符在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
在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
单pipe道|是其中一个按位运算符。
维基百科:
在C编程语言族中,按位或运算符是“|” (pipe)。 同样,这个操作符不能和它的布尔逻辑或对应的操作符相混淆,它把操作数当作布尔值,写成“||” (两pipe)。
& – (条件1&条件2):即使第一个条件是错误的,也检查两个条件
&& – (条件1 &&条件2):如果第一种情况是错误的,则不必费心检查第二种情况
&& – 运算符将使您的代码运行得更快,更专业,很less使用
| – (条件1 |条件2):即使情况1为真也检查两种情况
|| – (条件1 ||条件2):如果第一个条件为真,则不必麻烦检查第二种情况
|| – 运营商将使您的代码更快,更专业| 很less使用
通过它们的math定义,OR和AND是二元运算符; 无论如何,他们都会validationLHS和RHS条件,类似于| 和&。
|| 并且在LHS条件不满足时通过停止它们来改变OR和AND操作符的属性。
| 运算符对其两个操作数执行按位或运算(意味着双方都必须计算为false,否则返回false) 运营商将只评估第二个运营商是否需要。
http://msdn.microsoft.com/en-us/library/kxszd0kx(VS.71).aspx
http://msdn.microsoft.com/en-us/library/6373h346(VS.71).aspx
单pipe“|” 是“按位”还是只应该在你知道自己在做什么的时候使用。 双pipe“||” 是逻辑或,并且可以在逻辑语句中使用,如“x == 0 || x == 1”。
下面是一个按位或者做什么的例子:如果a = 0101和b = 0011,则a | b = 0111。 如果你正在处理一个将任何非零值视为真的逻辑系统,那么按位或将按照与逻辑或相同的方式进行操作,但它的对应(按位和“&”)不会。 也按位或不执行短路评估。
单个pipe道(|)是按位或运算符 。
两个pipe道(||)是逻辑OR运算符。
它们不可互换。
|| (两个pipe道)通常是逻辑或while | (一个pipe道)是一个二进制或。 关于我的头顶,我想不出任何时候这个差异会是一个大问题(除了将结果分配给别的东西)。 但是,我确定别人会有一个重要的情况。
编辑:哇,在我写这个的时候还有另外六个答案。
按位(|)与逻辑(||)! 将逻辑看作Java中的Comparable对象,比较一些可区分的“部分”,而按位运算符查看这些对象,而不是查看它们是否是可视化的双胞胎(如逻辑),做一个DNA样本并查看0和1代替。