`

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


分享到:
评论

相关推荐

    Java 短路运算符和非短路运算符详解

    Java 语言中有两种类型的逻辑运算符:短路运算符和非短路运算符。短路运算符包括“&&”和“||”,它们在逻辑表达式中使用,具有短路特性,即如果第一个表达式的结果已经确定了整个表达式的结果,那么就不再执行后续...

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

    总结起来,Java中的短路逻辑运算符(&&和||)在左侧表达式确定结果后会停止评估右侧,从而节省计算资源。非短路逻辑运算符(&和|)则会始终评估两侧表达式,无论结果如何。理解这些差异对于编写高效、可靠的Java代码...

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

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

    java中&&和&的区别

    在Java编程语言中,`&`和`&&`都是逻辑运算符,但它们在实际使用中存在一些重要的差异。理解这些差异对于编写高效且清晰的代码至关重要。 首先,两者都用于进行逻辑运算,评估左右两边的布尔表达式,并根据结果返回...

    Java语言中&&与& ||与|的区别是什么

    在Java编程语言中,逻辑运算符`&&`、`&`、`||`...总结一下,Java中的`&&`和`||`提供了短路逻辑,适合用于布尔条件判断,而`&`和`|`则用于按位操作,适用于整数类型的处理。在使用时,需根据具体需求选择合适的运算符。

    详解java中&和&&的区别

    在Java编程语言中,`&`和`&&`都是逻辑运算符,但它们在实际使用中有着明显的区别。本文将详细解析这两个运算符的差异,帮助开发者更好地理解和应用。 首先,`&`和`&&`都可以用来进行逻辑与操作。这意味着只有当两个...

    12.java逻辑运算符.zip

    Java还支持短路逻辑,这是逻辑与和逻辑或的一个特性。在逻辑与(&&)操作中,如果第一个表达式为假,那么第二个表达式不会被评估,因为无论其值如何,整个表达式都已经确定为假。同样,在逻辑或(||)操作中,如果第一个...

    java 逻辑运算符的资源

    在Java编程语言中,逻辑运算符是用于处理布尔值(true或false)的关键工具,它们在构建复杂的条件语句和控制程序流程时起着至关重要的作用。本资源着重讲解Java中的逻辑运算符及其用法。 1. **逻辑与(&&)**:此...

    第02章 Java编程基础 07 逻辑运算符与示例

    Java中的逻辑与(&&)和逻辑或(||)具有短路特性,这意味着它们在处理布尔表达式时,可以根据第一个表达式的结果决定是否评估第二个表达式。 - 对于逻辑与(&&):如果第一个表达式为假,那么程序不会评估第二个...

    java中&与&&的区别

    在Java编程语言中,`&` 和 `&&` 都被用作逻辑运算符,但它们之间存在着重要的差异。理解这些差异对于编写高效且逻辑正确的代码至关重要。 首先,`&` 是位运算符,同时也是一种逻辑运算符。作为位运算符,`&` 对两个...

    Java中&&与?表达式结合时出现的坑

    在Java编程语言中,开发者们经常需要处理逻辑表达式和条件判断。在这些场景中,&&(逻辑与)操作符和三元运算符(? :)是经常会用到的工具。然而,当这两个元素结合在一起使用时,可能会产生一些不易察觉的陷阱,即...

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

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

    java &与&&的区别及实例

    Java编程语言中,`&` 和 `&&` 都是用来进行逻辑运算的,但它们之间存在显著的区别。本文将深入探讨这两个运算符的工作原理、用法以及何时使用它们。 首先,`&` 是一个位运算符,同时也用作逻辑运算符。作为位运算符...

    关于短路运算,关于短路运算

    在Java中,有两种逻辑运算符:`&&`(逻辑与)和`||`(逻辑或)。这两种运算符都支持短路运算。具体来说: - `&&` 运算符:当左边的操作数为false时,右边的操作数将不会被计算。 - `||` 运算符:当左边的操作数为...

    大数据必学Java基础(十七):关系运算符和逻辑运算符

    逻辑运算符是Java编程语言中的一种高级运算符,用于组合多个关系运算符或逻辑运算符,以实现更复杂的逻辑判断。逻辑运算符包括:逻辑与(&)、逻辑或(|)、逻辑非(!)、逻辑异或(^)等。 在Java中,逻辑运算符的...

    Java逻辑运算符

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

    java选择题java选择题.docx

    * 短路与运算符(&&)和短路或运算符(||)是 Java 语言中的逻辑运算符。 六、Java 中的数组和多维数组 * Java 语言支持一维数组和多维数组。 * 一维数组可以使用 new int[大小] 声明,多维数组可以使用 new int...

    经典面试宝典 包含各类题型java +逻辑推理

    Java中`switch`语句只能作用于`byte`、`short`、`char`、`int`类型及其对应的封装类,不能直接作用于`long`、`float`、`double`或`String`类型。 ### 编程技巧 - 使用位运算进行快速计算。例如,计算2乘以8可以...

    92.090.JAVA基础教程_Java基本语法-复习2:比较与逻辑运算符(92).rar

    此外,Java还提供了短路逻辑运算符,如逻辑与(&)和逻辑或(|),它们的区别在于当第一个表达式足以确定整个结果时,短路运算符不会评估第二个表达式。这在处理可能抛出异常或有副作用的操作时特别有用。 学习和...

    Java位运算和逻辑运算的区别实例

    在Java编程语言中,位运算和逻辑运算都用于处理布尔值和整数,但它们在实际操作和行为上有着显著的差异。理解这些差异对于优化代码和深入理解计算机底层工作原理至关重要。 首先,我们来看看逻辑运算符。逻辑运算符...

Global site tag (gtag.js) - Google Analytics