JAVA中&&和&、||和|(短路与和逻辑与、短路或和逻辑或)的区别?

转载 2016年05月31日 10:52:03
问题一:



JAVA中&&和&、||和|(短路与和逻辑与、短路或和逻辑或)的区别?




首先名称是不同的

&&逻辑与  ||逻辑或  它们都是逻辑运算符

& 按位与  | 按位或  它们都是位运算符

if(a==1&&b==2) 这是说既要满足a=1也要满足b=2

if(a==1||b==2) 这是说或者满足a=1或者要满足b=2

而a&b或者a|b则是二进制的与或运算

&同为1时为1,否则为0

|同为0时为0,否则为1

3&5则

 0011

&0101

 0001

等于1



3|5则

 0011

|0101

 0111

等于7





&&逻辑与 也叫做短路与 因为只要当前项为假,它就不往后判断了,直接认为表达式为假

||逻辑或 也叫做短路或 因为只要当前项为真,它也不往后判断了,直接认为表达式为真









问题二:


关于Java 中逻辑运算与位运算的区别(具体到解一道题)

题目出自Java2实用教程(第三版)(却没有解释)

 

程序如下图:

 

 

 

运行结果如下:

 

为什么? x,y,a,b 不是都在IF语句里都重新赋值了吗?按道理全为真了,y也该是20了吧?(用程序验证过了,的确是这个结果)

 

 

回答:

 

 

逻辑运算符执行的是短路求值
所谓短路,就是当参与运算的一个操作数已经足以推断出这个表达式的值的时候,另外一个操作数(有可能是表达式)就不会 执行

比如:
static boolean f1() { System.out.println( "function f1 called." ); return true; }
static boolean f2() { System.out.println( "function f2 called." ); return false; }
if ( false && f1() ) {} // f1不会被调用
if ( true || f2() ){} // f2不会被调用

由于&& 要求它的参与操作的两个操作数都是布尔值真,才得真,所以只要得出其中一个为假,那么另一部分的表达式就不会被求值(在上面的例子中是f1()不会被调 用)
同理由于||要求它的参与操作的两个操作数只要其中之一为真,就得真,所以只要得出其中一个为真,那么另一部分也不会被求值(在上面的例子中 是f2()不会被调用)

这就是逻辑操作符所谓的“短路求值” 

位操作没有这一特性,所以不管那边的值是如 何,任何参与运算的表达式都会被执行求值,因此也就产生了你代码之中的结果了。

 

 

 

 

 

 

 

 

 

 

三、Java中逻辑运算短路的理解:

 

 

短路” 主要用于逻辑运算符中,即 “ !   && || "这三种运算符
短路 就是知如果左侧的表达式能确定运算后的结果,则不再计算右侧的表达式。
如(1>2)&&(2<3)   明明左侧已经为假 了   ,我 不用计算右侧我一定知道 此表达是为假,这样 就好似物理中的电流,当某处短路时,电流直接从一条路通过,而不再管另一条路。

看个例子:

public class Logic{
public static void main(String[] args){

int a = 1;
int b = 1;
if(a<b&&b<a++){
System.out.println(a>b&true);
System.out.println(a);
System.out.println("this's in my control");
}
else{
System.out.println("that's impossible");
System.out.println(a);
}

}
}

此处由于a<b为假 ,所以 后面的b<a++不会执行
此处的结果为 
that's impossible
1
若假设a的初值为0,此时a<b成立,这时就要计算后面的值了
结果应该为和上面一样。


网上看见有人对   && 与 & 有点混淆,顺便说说我的理解
本来 & 是个 位运算符
也就是主要用来 做二进制运算的,如 010101&101010 = 000000

但它的特别之处 在于 它可以 进行 boolean值的运算
就像我上面写的   a>b&true 

其实我想这追根究地 在于 boolean 在内存中是用一位二进制来表示的,故可以进行位运算
我们不能被表象所迷惑 ,认为这是逻辑运算 ,这样理解就根本不存在讨论短路的必要了。

Java的位运算符详解实例——与(&)、非(~)、或(|)、异或(^)

位运算符主要针对二进制,它包括了:“与”、“非”、“或”、“异或”。从表面上看似乎有点像逻辑运算符,但逻辑运算符是针对两个关系运算符来进行逻辑运算,而位运算符主要针对两个二进制数的位进行逻辑运算。下面...
  • vebasan
  • vebasan
  • 2011年02月18日 17:44
  • 222400

Java的位运算符详解实例——与(&)、非(~)、或(|)、异或(^)

位运算符主要针对二进制,它包括了:“与”、“非”、“或”、“异或”。从表面上看似乎有点像逻辑运算符,但逻辑运算符是针对两个关系运算符来进行逻辑运算,而位运算符主要针对两个二进制数的位进行逻辑运算。下面...

Java的运算符号(逻辑与、或、非、移位运算)

1.只可将AND,OR 或NOT 应用于布尔值。与在C 及C++中不同,不可将一个非布尔值当作布尔值在逻辑表达式中使用。 2.在AND(&&)运算中a()&&b()&&c(),当a为false时,b...

java 的与& ,或| ,非~ 运算符计算方法逻辑

以下属于个人理解,也经过测试,如果错误还请谅解,再次温习了大学的基础知识 1  非(~)运算符的计算: 补充说明, 1:最高位为0代表正数,最高位为1的代表负数 2:已知一个...

【Java】Java中的位运算符与、或、非、异或的使用

位运算符在处理整形数值时,可以直接对组成整形数值的各个位进行操作。这些位运算符在位模式下工作。位运算符包括:&、|、~、^令 ‘a’ = 129 = 10000001,’b’ = 128 = 1000...

Java的位运算符详解实例——与(&)、非(~)、或(|)、异或(^)

位运算符主要针对二进制,它包括了:“与”、“非”、“或”、“异或”。从表面上看似乎有点像逻辑运算符,但逻辑运算符是针对两个关系运算符来进行逻辑运算,而位运算符主要针对两个二进制数的位进行逻辑运算。下面...

JAVA中&&和&、||和|(短路与和逻辑与、短路或和逻辑或)的区别

&&逻辑与 也叫做短路与 因为只要当前项为假,它就不往后判断了,直接认为表达式为假 ||逻辑或 也叫做短路或 因为只要当前项为真,它也不往后判断了,直接认为表达式为真...
  • websph
  • websph
  • 2010年06月13日 15:45
  • 27971

逻辑运算的短路问题

最近在代码中因为逻辑运算的短路问题,引起

Java中逻辑与和简洁与(&和&&)逻辑或和简洁或(|和||)的区别

&称为逻辑与,只有两个操作数都是true,结果才是true。 &&称为简洁与或者短路与,也是只有两个操作数都是true,结果才是true。但是如果左边操作数为false,就不计算右边的表达式,直接得...

Java 按位与(&)和短路与(&&)按位或(|)和短路或(||)的区别总结

按位与&和短路与&&区别: & 既是位运算符又是逻辑运算符,&的两侧可以是int,也可以是boolean表达式,当&两侧是int时,要先把运算符两侧的数转化为二进制数再进行运算,而短路与(&...
  • pcxbest
  • pcxbest
  • 2012年07月24日 20:21
  • 7981
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:JAVA中&&和&、||和|(短路与和逻辑与、短路或和逻辑或)的区别?
举报原因:
原因补充:

(最多只允许输入30个字)