本人已参与「新人创作礼」活动,一起开启掘金创作之路。不经一番寒侧骨,哪能梅花扑鼻香。
在Java中,我们经常使用&&和|| ,却忽略了&和|的区别。你是否思考过为什么我们会一直使用&&或||而很少使用&和|呢?它们有什么相同点和不同点呢?跟随作者,一起来回忆一下吧!
1. &&和&
1.1 语法规则
&&和&都是java逻辑运算符中的一员,它们都可以用来表示与的关系。它们是一个二元运算符,当且仅当左右元素全部为真时,结果才为真。即 "有假则假,全真为真" 。
| A | B | && | & |
|---|---|---|---|
| false | false | false | false |
| false | true | false | false |
| true | false | false | false |
| true | true | true | true |
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逻辑运算符中的一员,它们都可以用来表示或的关系。它们是一个二元运算符。当且仅当左右元素全部为假时,结果才为假。遵循 "有真则真,全假为假" 的规则。
| A | B | 短路或 | 逻辑或 |
|---|---|---|---|
| false | false | false | false |
| false | true | false | false |
| true | false | false | false |
| true | true | true | true |
1.2 相同点
短路或||和逻辑或|都可以表示或的关系。当且仅当左右元素全部为真时,当且仅当左右元素全部为假时,结果才为假。
1.3 不同点
两则的不同点和与的类似:
- 当第一个元素为真时,短路或不再对第二个元素进行判断,即执行“有真则真”原则,提高了执代码效率。
- 当第一个元素为真时,逻辑与仍会对第二个元素进行判断,即执行“全假为假”原则,效率较低。