ChatGPT解决这个技术问题 Extra ChatGPT

有什么区别 |和 ||还是运营商?

在 C# 和 PHP 中,我一直在 OR 表达式中使用 ||(两个管道)。有时我会看到使用了一个管道:|。这两种用法有什么区别?在使用其中一个时是否有任何警告,或者它们是否可以互换?


Z
Zze

就像 &&& 运算符一样,double 运算符是“短路”运算符。

例如:

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 为 false 后停止。如果您只使用 &,它会尝试检查 class.someVar,您会得到一个不错的 NullReferenceException。使用 Or-Operator 可能不是那么大的陷阱,因为您不太可能触发不好的事情,但要牢记这一点。

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

不过,|& 运算符还有第二个用途:Bitwise Operations


E
Evan Shaw

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

condition1 || condition2

如果条件 1 或条件 2 为真,则计算为真。

|是按位或运算符。它用于对两个数字进行操作。您单独查看每个数字的每个位,如果其中一个位在至少一个数字中为 1,则结果位也将为 1。这里有一些例子:

A = 01010101
B = 10101010
A | B = 11111111

A = 00000001
B = 00010000
A | B = 00010001

A = 10001011
B = 00101100

A | B = 10101111

希望这是有道理的。

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


这有助于我了解有人如何使用按位 OR 运算符来合并 Mongodb C# 驱动程序中的过滤器。 gist.github.com/a3dho3yn/…
“它用于对两个数字进行操作” 这是一个不准确/不完整的描述。 if (true | false) 在 C# 中完全有效。
R
Rui Jarimba

一种是“按位或”。

10011b | 01000b => 11011b

另一个是逻辑或。

真或假 => 真


| 也可用于 bool 类型而无需短路。
对于不熟悉位运算符的任何人,都可以获得结果示例,因为每一列中的每一位行都使用 OR 比较与另一行进行了测试。 docs.microsoft.com/en-us/cpp/c-language/c-bitwise-operators
k
krobelusmeetsyndra

好问题。这两个运算符在 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。这是大多数人对 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


FWIW,从技术上讲,在 C# 中,| 在应用于 booleans 时是一个逻辑或。正如您的链接参考所述。实际上,最终结果与按位运算符相同,因为 truefalse 的按位值使得按位或它们的值产生与逻辑或完全相同的结果。即 (int)(bool1 | bool2) == ((int)bool1) | ((int)bool2)
B
Bhai Saab

& - (Condition 1 & Condition 2):检查两种情况,即使第一种情况为假

&& - (条件 1 && 条件 2):如果第一种情况为假,则不必检查第二种情况

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

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

|| - (条件 1 || 条件 2):如果第一个为真,则不必检查第二种情况

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


rarely used?一切都取决于您想要或需要做什么。
伟大的!简短而甜蜜,我会删除“| 很少使用”和“& 很少使用”,因为正如 Emaborsa 所说,它真的取决于你想要或需要做什么。
我非常依赖按位运算。这些特定的运算符在处理标志时也很有用。您误认为人们很少使用它们,而我很少使用它们。
很少使用的手段很少是适当的运算符,因为在所有可能的情况下,“或”操作都应该短路。
v
vishesh

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

为什么你会为一个甚至没有提到java的问题给出一个java示例?
D
Dragos Bandur

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

||和 && 通过在 LHS 条件不满足时停止它们来改变 OR 和 AND 运算符的属性。


T
Tharindu Vindula

对于按位 | 和 Logall ||

或者

按位 & 和逻辑 &&

这意味着将评估第一个左侧的 a>b 中的 if( a>b | a==0),然后评估 a==0,然后完成 | 操作

但在|| if a>b中,如果不会检查下一个 RHS

同样对于 & 和 &&

if(A>0 & B>0)

它将评估 LHS 然后 RHS 然后按位 & 但是

(A>0 && B>0)

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


c
codeLes

单管道 | 是 bitwise 运算符之一。

来自维基百科:

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


h
homeskillet

该|运算符对其两个操作数执行按位或(意味着双方必须评估为假才能返回假),而 ||运算符只会在需要时评估第二个运算符。

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

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


如果您真的阅读了这些文章,您会发现它们指的是按位运算符
这不是按位的意思。
K
Kyle Cronin

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

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


'|'也可用于 bool 类型而无需短路。
D
Dane

单个管道 (|) 是 bitwise OR operator

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

它们不可互换。


如果忽略按位运算,则在逻辑运算符区域内,双管道是惰性求值,而单管道是贪婪的。