我一直用 || (两个管道)在 C# 和 PHP 中的 OR 表达式中。有时我会看到使用单个管道: |. 。这两种用法有什么区别?使用其中一种替代另一种时是否有任何注意事项,或者它们可以互换吗?

有帮助吗?

解决方案

就像 &&& 运算符,双运算符是“短路”运算符。

例如:

if(condition1 || condition2 || condition3)

如果条件 1 为真,则不会检查条件 2 和 3。

if(condition1 | condition2 | condition3)

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

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

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

如果 class 为 null,则 if 语句将在之后停止 class != null 是假的。如果你只使用&,它会尝试检查 class.someVar 你会得到一个很好的 NullReferenceException. 。对于 Or 运算符来说,这可能不是一个太大的陷阱,因为您不太可能触发一些不好的事情,但需要记住这一点。

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

还有第二个用途 |& 但运算符: 按位运算.

其他提示

||是逻辑 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

希望这是有道理的。

因此,为了回答最后两个问题,除了“了解两个运算符之间的区别”之外,我不会说任何警告。它们不可互换,因为它们做两件完全不同的事情。

一种是“按位或”。

10011乙 |01000b => 11011b

另一个是逻辑或。

真或假 => 真

好问题。这两个运算符在 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。这是大多数人思考“或”的方式,并根据两个值的真实情况进行比较。例如。我要去商店或者去商场。这是代码中最常用的一种。例如。

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

& - (条件 1 和条件 2):即使第一个为 false,也会检查这两种情况

&& -(条件 1 && 条件 2):如果情况一,则懒得检查第二种情况 是假的

&& - 运算符将使您的代码运行得更快、更专业 & 很少使用

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

||- (条件 1 ||条件 2):如果第一种情况,请不要费心检查第二种情况 一个是真的

||- operator 将使您的代码运行得更快、更专业 |很少使用

单管 | 是其中之一 按位 运营商。

来自维基百科:

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

根据其数学定义,OR 和 AND 是二元运算符;无论如何,它们都会验证 LHS 和 RHS 条件,类似于 |和 &。

||和 && 更改 OR 和 AND 运算符的属性,方法是在未满足 LHS 条件时停止它们。

这 |运算符对其两个操作数执行按位 OR(这意味着双方的计算结果必须为 false 才能返回 false),而 ||Operator 将仅在需要时评估第二个 Operator。

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

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

单管道“|”是“按位”或,只有在您知道自己在做什么时才应使用。双管道 “||” 是逻辑 or,可以在逻辑语句中使用,例如 “x == 0 ||x == 1”。

下面是按位或的作用的示例:如果a=0101且b=0011,则a|b=0111。如果您正在处理将任何非零视为 true 的逻辑系统,则按位或将以与逻辑或相同的方式起作用,但它的对应项(按位与,“&”)不会。另外,按位或不执行短路评估。

单管 (|) 是 按位或运算符.

两个管道 (||) 是逻辑 OR 运算符。

它们不可互换。

||(两根管子)通常是一个 逻辑的 或 while |(一根管子)是一个 二进制 或者。在我的脑海中,我想不出任何时候这种差异会是一个大问题(除了当你将结果分配给其他东西时)。但我确信其他人也会遇到重要的情况。

编辑:哇,在我写这篇文章的时间里,还有六个答案。

按位 (|) 与按位 (|) 对比逻辑(||)!将逻辑视为 Java 中的可比较对象,比较一些可区分的“部分”,同时按位运算符查看这些对象,而不是查看它们是否在视觉上是双胞胎(如逻辑那样),而是进行 DNA 采样并查看 0 和 1反而。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top