布尔运算符的差异:&vs &&和| vs ||

Sum*_*hra 104 java boolean-logic bitwise-operators logical-operators

我知道规则&&,||但是什么是&|?请以一个例子向我解释这些.

Jus*_*ner 125

这些是按位AND和按位OR运算符.

int a = 6; // 110
int b = 4; // 100

// Bitwise AND    

int c = a & b;
//   110
// & 100
// -----
//   100

// Bitwise OR

int d = a | b;
//   110
// | 100
// -----
//   110

System.out.println(c); // 4
System.out.println(d); // 6
Run Code Online (Sandbox Code Playgroud)

感谢卡洛斯指出在Java语言规范中相应的部分(15.22.1,15.22.2关于基于其输入操作者的不同的行为).

实际上,当两个输入都是布尔值时,运算符被认为是布尔逻辑运算符,其行为类似于Conditional-And(&&和)和Conditional-Or(||)运算符,除非它们不会短路,因此以下是安全的:

if((a != null) && (a.something == 3)){
}
Run Code Online (Sandbox Code Playgroud)

这不是:

if((a != null) & (a.something == 3)){
}
Run Code Online (Sandbox Code Playgroud)

  • 什么是非短路逻辑运算符?运营商&和| (OP询问)是"整数位运算符"(JLS 15.22.1)**和**"布尔逻辑运算符"(JLS 15.22.2).或者Java语言规范是错误的吗? (4认同)

Tor*_*res 104

我想你在谈论两个运营商的逻辑意义,在这里你有一个表简历:

boolean a, b;

Operation     Meaning                       Note
---------     -------                       ----
   a && b     logical AND                    short-circuiting
   a || b     logical OR                     short-circuiting
   a &  b     boolean logical AND            not short-circuiting
   a |  b     boolean logical OR             not short-circuiting
   a ^  b     boolean logical exclusive OR
  !a          logical NOT

short-circuiting        (x != 0) && (1/x > 1)   SAFE
not short-circuiting    (x != 0) &  (1/x > 1)   NOT SAFE
Run Code Online (Sandbox Code Playgroud)


Lyn*_*rer 25

我知道这里有很多答案,但它们看起来有点令人困惑.因此,在从Java oracle学习指南做一些研究之后,我想出了三种不同的场景,即何时使用&&或&.这三种情况是逻辑AND,按位AND布尔AND.

逻辑AND: 逻辑AND(又名条件AND)使用&&运算符.它是短路的意思:如果左操作数为假,则不会评估右操作数.
例:

int x = 0;
if (false && (1 == ++x) {
    System.out.println("Inside of if");
}
System.out.println(x); // "0"
Run Code Online (Sandbox Code Playgroud)

在上面的例子中,打印到x控制台的值将为0,因为if语句中的第一个操作数是false,因此java不需要计算(1 == ++ x)因此不会计算x.

按位AND: 按位AND使用&运算符.它用于对值进行按位运算.通过查看二进制数字运算,可以更容易地看到正在发生的事情:

int a = 5;     //                    5 in binary is 0101
int b = 12;    //                   12 in binary is 1100
int c = a & b; // bitwise & preformed on a and b is 0100 which is 4
Run Code Online (Sandbox Code Playgroud)

正如您在示例中所看到的,当数字5和12的二进制表示排成一行时,按位AND预先形成将只生成二进制数,其中两个数字中的相同数字具有1.因此0101和1100 == 0100.十进制数为5和12 == 4.

布尔AND: 现在,布尔AND运算符的行为与按位AND和逻辑AND的行为相似且不同.我喜欢把它想象为在两个布尔值(或位)之间执行按位AND,因此它使用&运算符.布尔值也可以是逻辑表达式的结果.

它返回true或false值,非常类似于逻辑AND,但与逻辑AND不同,它不会短路.原因是,它要按预先形成按位AND,它必须知道左右操作数的值.这是一个例子:

int x = 0;
if (false & (1 == ++x) {
    System.out.println("Inside of if");
}
System.out.println(x); //"1"
Run Code Online (Sandbox Code Playgroud)

现在,当运行if语句时,即使左操作数为false,也将执行表达式(1 == ++ x).因此,为x打印的值将为1,因为它增加了.

这也适用于逻辑OR(||),按位OR(|)和布尔OR(|)希望这可以解决一些混乱.


Tas*_*kos 7

运算符&&和|| 是短路的,这意味着如果左手表达的值足以确定结果,他们就不会评估他们的右手表达.

  • -1告诉OP他已经知道什么,而不回答他实际问的问题. (7认同)

Bri*_*ott 5

&和| 提供与&&和||相同的结果 操作员。不同之处在于,它们总是对表达式的两边都进行计算,其中&&和|| 停止评估第一个条件是否足以确定结果。