`

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

阅读更多
转自 :http://blog.csdn.net/websph/archive/2010/06/13/5669363.aspx
问题一:

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 在内存中是用一位二进制来表示的,故可以进行位运算
我们不能被表象所迷惑 ,认为这是逻辑运算 ,这样理解就根本不存在讨论短路的必要了。


分享到:
评论

相关推荐

    34.java短路逻辑运算符.zip

    34.java短路逻辑运算符.zip34.java短路逻辑运算符.zip34.java短路逻辑运算符.zip34.java短路逻辑运算符.zip34.java短路逻辑运算符.zip34.java短路逻辑运算符.zip34.java短路逻辑运算符.zip34.java短路逻辑运算符.zip...

    Java中短路与和与,短路或和或逻辑运算符区别.pdf

    Java中短路与和与,短路或和或逻辑运算符区别.pdf 学习资料 复习资料 教学资源

    Java程序设计基础:逻辑运算符.pptx

    逻辑运算符 目录 课程导入 掌握逻辑运算符的运算规则 能使用逻辑运算符组合条件 已知一个三角形的三条边长已经存放在变量a,b,c中,如何确定这个三角形能成立呢?条件如何写? 引入 a c b a+b&gt;c , a+c&gt;b , b+c&gt;a a+...

    Java逻辑运算符

    Java中的逻辑运算符包括逻辑与&,逻辑或|,逻辑非!逻辑异或^,除此之外还有几个比较相似的&&短路与,||短路或。  那么这几个逻辑运算符到底有什么意思呢?下面我们来看看  首先看逻辑与&的用法,只有两个都为真...

    java基础教程301集049 =与== 逻辑与和短路与 逻辑或和.mp4

    java基础教程301集049 =与== 逻辑与和短路与 逻辑或和.mp4

    JAVA面试大全(2018整理版)

    &和&&的区别? 虽然二者都要求运算符左右两端的布尔值都是true整个表达式的值才是true。&&之所以称为短路运算是因为,如果&&左边的表达式的值是false,...注意:逻辑或运算符(|)和短路或运算符(||)的差别也是如此。

    java逻辑运算符的作用

    逻辑运算符 &&、 ||、 ! 注意:逻辑计算支持短路操作 表达多个条件之间的关系。例如年龄大于等于18并且...||:或运算,含义是两个条件中成立一个即可,可以翻译为或者 !:非运算,含义是不是,用于对某个条件进行否定

    Java中的短路效应

    对于逻辑运算符&& 和 ||,学过discrete Math的同学都知道,一个是与,一个是或。在Java中它们存在短路效应。  对于a && b,只有当a和b同时为true时,整个表达式才为true,在java中,首先运算表达式a,如果a为true...

    Java就业面试笔试题资料-264道.zip

    &和&&都可以用作逻辑与的运算符,表示逻辑与(and),当运算符两边的表达式的结果都为true时,整个运算结果才为true,否则,只要有一方为false,则结果为false。 &&还具有短路的功能,即如果第一个表达式为false,则

    2.Java基础语法.ppt

    短路或 || 短路或与逻辑或 结果一模一样。只要第一个操作数是true,那么第二个就不用计算,结果就是true。同样为了提高效率。 3.关系运算符(&gt;,&lt;,&gt;=,,==,!=) ==:比较变量时是判断数值是否相等;比较引用...

    java经典面试题集锦

    &和&&都可以用作逻辑与的运算符,表示逻辑与(and),当运算符两边的表达式的结果都为true时,整个运算结果才为true,否则,只要有一方为false,则结果为false。 &&还具有短路的功能,即如果第一个表达式为false,则...

    125集专攻JAVA基础 JAVA零基础入门学习视频教程 动力节点JAVA视频教程.txt

    北京动力节点-Java编程零基础教程-077-Java基本语法-运算符-逻辑运算符-与操作的短路运算.avi 北京动力节点-Java编程零基础教程-078-Java基本语法-运算符-逻辑运算符-或操作的运算规则.avi 北京动力节点-Java编程...

    java代码-逻辑运算符

    java代码-逻辑运算符

    Java面试宝典(传说中的葵花宝典).doc

    &和&&都可以用作逻辑与的运算符,表示逻辑与(and),当运算符两边的表达式的结果都为true时,整个运算结果才为true,否则,只要有一方为false,则结果为false。 &&还具有短路的功能,即如果第一个表达式为false,则...

    Thinking in java4(中文高清版)-java的'圣经'

    3.5.1 一元加、减操作符 3.6 自动递增和递减 3.7 关系操作符 3.7.1 测试对象的等价性 3.8 逻辑操作符 3.8.1 短路 3.9 直接常量 3.9.1 指数记数法 3.10 按位操作符 3.11 移位操作符 3.12 三元操作符 if-else 3.13 ...

    java 面试题 总结

    与cgi的区别在于servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于servlet。...

    张孝祥java就业面试宝典

    &和&&都可以用作逻辑与的运算符,表示逻辑与(and),当运算符两边的表达式的结果都为true时,整个运算结果才为true,否则,只要有一方为false,则结果为false。 &&还具有短路的功能,即如果第一个表达式为false...

    Java基础知识点.html

    跳转控制语句 三元运算符 逻辑运算符 短路逻辑运算符 数组 方法简述 switch语句 if语句 关系运算符 自增自减运算符 赋值运算符 算术运算符 类型转换 Java简述 标识符 变量 数据类型 常量 关键字

    2020年Java基础面试必问一(内附代码详解)

    Java 中 && 和 & 都是表示与的逻辑运算符,都表示逻辑运输符 and,当两边的表达式都为 true 的时候,整个运算结果才为 true,否则为 false。 &&:有短路功能,当第一个表达式的值为 false 的时候,则不再计算第二个...

Global site tag (gtag.js) - Google Analytics