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

Glo*_*ish 288 php c# operators

我一直||在OR表达式中使用(两个管道),包括C#和PHP.偶尔我会看到一个使用的管道:|.这两种用法有什么区别?当使用一个在另一个之上时是否有任何警告或者它们是否可以互换?

Mic*_*tum 467

就像&&&运算符一样,双运算符是一个"短路"运算符.

例如:

if(condition1 || condition2 || condition3)
Run Code Online (Sandbox Code Playgroud)

如果condition1为true,则不检查条件2和3.

if(condition1 | condition2 | condition3)
Run Code Online (Sandbox Code Playgroud)

这将检查条件2和3,即使1已经为真.由于您的条件可能是非常昂贵的功能,因此使用它们可以获得良好的性能提升.

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

if(class != null && class.someVar < 20)
Run Code Online (Sandbox Code Playgroud)

如果class为null,则if语句将在class != nullfalse 之后停止.如果你只使用&,它会尝试检查class.someVar你会得到一个很好的NullReferenceException.使用Or-Operator可能不是一个陷阱,因为你不太可能触发坏事,但这是要记住的事情.

但是,除非你的设计中每个条件都是要执行的函数,否则没有人会使用单个&|运算符.听起来像是一种设计气味,但有时(很少)这是一种干净的做事方式.该&操作者"跑这3个功能,如果其中一个返回false,执行else块",而|不会"只如果没有返回false运行else块" -可能是有用的,但正如所说,往往这是一个设计闻.

然而,第二次使用|&运算符:按位运算.

  • 这不是黑客攻击,它的正式的C#第7.10.3布尔逻辑运算符规定:"X的结果|如果x或y是真实的y为true,否则,结果是假的." 另请参见第7.11节条件逻辑运算符:"操作x || y对应于操作x | y,但只有当x为false时才计算y." 进一步"合法化"| 作为条件运算符.如果他们只是盲目地认为那些东西是平等的,那么那些使用C/C++的人无论如何都会遇到麻烦.如上所述:使用| 在if语句中是一种设计气味,但是完全合法的操作. (44认同)
  • 教人们使用`&`和`|`作为条件运算符是一种破解,如果他们需要使用C/C++会让他们遇到麻烦:`1 && 2`是真的,而'1&2`是假的. (23认同)
  • @ BlueRaja-DannyPflughoeft调用记录功能,黑客攻击时的文件说,它的目的是使用,就像使用switch语句"的elseif的黑客"的说法.它是工具箱中的工具,可能是一种很少使用的专用工具,但却是一种工具. (13认同)
  • 是的,在我创建一个控制台应用程序之前我不相信 - 但是好主!为什么他们会给你绳子自己挂!我讨厌VB.NET - OrElse和AndAlso关键字! (9认同)
  • 我从来没有说它不合法,只是它是一个黑客,它是*(你使用`&`传达一种意义,而不是它几乎总是意味着:按位 - 和*). (9认同)
  • @ BlueRaja-DannyPflughoeft通过那个逻辑做而while循环在你的应用程序中没有位置,因为它们很少用于我做过的大多数商业应用程序开发.通过称之为黑客,您正在注入您的意见并假设没有合理的理由让任何人使用它.OP询问了它的不同之处以及使用它的注意事项. (6认同)
  • 如果它做了它做的事情,它不是一个黑客. (3认同)
  • 喜欢这些命令的短路特性!我一直使用此方法仅在第一次检查成功时才执行第二次检查,例如,空对象检查:if(myObj!= null &amp;&amp; myObj.resultCode == 0)Console.WriteLine(“ Yay!”); (2认同)
  • @Gent:编写软件时的第一条规则是使代码尽可能清晰可读.如果你使用的"很少使用"的语法没有正确地传达你的意图并且会让很多读者感到困惑,那么当有更清晰的选择时,它就是错误的代码.这是一个黑客. (2认同)

Eva*_*haw 77

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

condition1 || condition2
Run Code Online (Sandbox Code Playgroud)

如果condition1 OR condition2为true,则求值为true.

| 是按位OR运算符.它用于操作两个数字.您可以单独查看每个数字的每个位,如果其中一个位在至少一个数字中为1,那么结果位也将为1.这里有一些例子:

A = 01010101
B = 10101010
A | B = 11111111

A = 00000001
B = 00010000
A | B = 00010001

A = 10001011
B = 00101100

A | B = 10101111
Run Code Online (Sandbox Code Playgroud)

希望这是有道理的.

因此,为了回答最后两个问题,除了"了解两个运营商之间的区别"之外,我不会说任何警告.它们不可互换,因为它们完成两件完全不同的事情.

  • *“它用于对两个数字进行操作”*这是一个不准确/不完整的描述。`if (true | false)` 在 C# 中完全有效。 (4认同)

nsa*_*ers 29

一个是"按位或".

10011b | 01000b => 11011b

另一个是逻辑或.

true或false => true

  • `|`也可以用于`bool`类型,而不会发生短路。 (2认同)

Tre*_*ell 12

好问题.这两个运算符在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
Run Code Online (Sandbox Code Playgroud)

|| 是一个逻辑OR.这是大多数人对OR的看法,并根据他们的真相比较两个值.我要去商店,否则我会去商场.这是代码中最常用的一个.例如

if(Name == "Admin" || Name == "Developer") { //allow access } //checks if name equals Admin OR Name equals Developer
Run Code Online (Sandbox Code Playgroud)

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#`|`中是**逻辑或**应用于**布尔**.正如您的链接参考所述.在实践中,最终结果与它是一个按位运算符相同,因为"true"和"false"的按位值使得按位或其值产生与逻辑或完全相同的结果.那是`(int)(bool1 | bool2)`==`((int)bool1)| ((int)的BOOL2)`. (2认同)

小智 10

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

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

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

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

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

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

  • `很少使用`?一切都取决于您想要或需要做什么。 (2认同)
  • 伟大的!简短而甜蜜,我会删除“| 很少使用”和“&amp; 很少使用”,因为正如 Emaborsa 所说,这实际上取决于您想要或需要做什么。 (2认同)

vis*_*esh 5

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;
  }
}
Run Code Online (Sandbox Code Playgroud)

输出 :

using double pipe
x = 5
y = 0
using single pipe
x = 5
y = 5
Run Code Online (Sandbox Code Playgroud)

  • 你为什么要为一个甚至没有提到 java 的问题举一个 java 例子? (2认同)