短路与&&和逻辑与&的区别 你还记得吗?

893 阅读4分钟

本人已参与「新人创作礼」活动,一起开启掘金创作之路。不经一番寒侧骨,哪能梅花扑鼻香。

在Java中,我们经常使用&&|| ,却忽略了&|的区别。你是否思考过为什么我们会一直使用&&||而很少使用&|呢?它们有什么相同点和不同点呢?跟随作者,一起来回忆一下吧!

1. &&和&

1.1 语法规则

&&&都是java逻辑运算符中的一员,它们都可以用来表示的关系。它们是一个二元运算符,当且仅当左右元素全部为真时,结果才为真。即 "有假则假,全真为真"

AB&&&
falsefalsefalsefalse
falsetruefalsefalse
truefalsefalsefalse
truetruetruetrue

1.2 相同点

短路与&&和逻辑与&都可以表示的关系。当且仅当左右元素全部为真时,结果才为真。我们可以通过以下简单的代码示例来感受一下:

 int a = 1;
 int b = 2;
 // 短路与
 if((a==b)&&(a==1)){

 }else{
     System.out.println("短路与“&&”正常执行(结果为false),没有抛出异常");
 }
 
 // 逻辑与
 if((a==b)&(a==1)){
 
 }else{
     System.out.println("逻辑与“&”正常执行(结果为false),没有抛出异常");
 }

运行代码,输出结果为:

 短路与“&&”正常执行(结果为false),没有抛出异常
 逻辑与“&”正常执行(结果为false),没有抛出异常

1.3 不同点

短路与&&和逻辑与&都可以表示的关系,,其语法规则也相同,那两者差别在哪里呢?我们可以先将上面示例代码中的判断条件改动一下:即将运算符号之后的元素故意设置成错误形式(0不可以作为除数) ,按照正常逻辑来说,遇到除0的情况,程序会抛出异常。运行程序,观察输出结果:

 int a = 1;
 int b = 2;
 // 短路与
 if((a==b)&&(100/0==1)){
 
 }else{
     System.out.println("短路与“&&”正常执行(结果为false),没有抛出异常");
 }
 
 // 逻辑与
 if((a==b)&(100/0==1)){
 
 }else{
     System.out.println("逻辑与“&”正常执行(结果为false),没有抛出异常");
 }

输出结果为:

 短路与“&&”正常执行(结果为false),没有抛出异常
 Exception in thread "main" java.lang.ArithmeticException: / by zero at src.LogicalOperator.main(LogicalOperator.java:15)

通过观察结果我们可以看到当使用短路与部分的代码正常执行了,而使用逻辑与部分的代码则抛出了异常。

原因如下:

当使用短路与&&时,代码会从左向右执行,当第一个元素为假时,整个代码的结果已经得出(有假则假),不再对第二个元素进行判断,即不执行第二个元素的代码了,因此,即使第二个元素含有错误,也不会抛出异常,因为该元素并未执行!即相当于第二个元素被“短路”了。

当使用逻辑与&时,代码仍会从左向右执行,当第一个元素为假时,仍会判断第二个元素的真假。 此时,定会抛出异常!

因此短路与&& 和逻辑与&的不同点在于:

  • 当第一个元素为假时,短路与不再对第二个元素进行判断,即执行“有假则假”原则,提高了执代码效率。
  • 当第一个元素为假时,逻辑与仍会对第二个元素进行判断,即执行“全真为真”原则,效率较低。

2. || 和 |

2.1 语法规则

|||都是java逻辑运算符中的一员,它们都可以用来表示的关系。它们是一个二元运算符。当且仅当左右元素全部为假时,结果才为假。遵循 "有真则真,全假为假" 的规则。

AB短路或逻辑或
falsefalsefalsefalse
falsetruefalsefalse
truefalsefalsefalse
truetruetruetrue

1.2 相同点

短路或||和逻辑或|都可以表示的关系。当且仅当左右元素全部为真时,当且仅当左右元素全部为假时,结果才为假。

1.3 不同点

两则的不同点和的类似:

  • 当第一个元素为时,短路或不再对第二个元素进行判断,即执行“有真则真”原则,提高了执代码效率。
  • 当第一个元素为时,逻辑与仍会对第二个元素进行判断,即执行“全假为假”原则,效率较低。