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

问题一:



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

  • 21
    点赞
  • 89
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
逻辑与(&&)和逻辑或(||)是Java常见的逻辑运算符,它们有以下区别: 1. 短路运算: - 逻辑与(&&):如果第一个表达式为false,则不会执行第二个表达式,因为无论第二个表达式的结果如何,整个表达式都会被判定为false。 - 逻辑或(||):如果第一个表达式为true,则不会执行第二个表达式,因为无论第二个表达式的结果如何,整个表达式都会被判定为true。 2. 执行顺序: - 逻辑与(&&):先执行第一个表达式,如果第一个表达式为true,则继续执行第二个表达式,最终返回第二个表达式的结果。 - 逻辑或(||):先执行第一个表达式,如果第一个表达式为false,则继续执行第二个表达式,最终返回第二个表达式的结果。 在实际开发逻辑与(&&)和逻辑或(||)经常用于条件判断和控制流程。例如,可以使用逻辑与(&&)来判断多个条件是否同时满足,只有当所有条件都为true时,整个表达式才会返回true。而逻辑或(||)可以用于判断多个条件是否至少有一个满足,只要有一个条件为true,整个表达式就会返回true。 以下是一个示例代码: ```java int a = 5; int b = 10; int c = 15; // 使用逻辑与(&&)判断多个条件是否同时满足 if (a > 0 && b > 0 && c > 0) { System.out.println("所有数都大于0");} // 使用逻辑或(||)判断多个条件是否至少有一个满足 if (a > 0 || b > 0 || c > 0) { System.out.println("至少有一个数大于0"); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值