& 与 && 、| 与 || ,傻傻分不清???
逻辑运算符
逻辑运算符用来表示日常交流中的“并且”,“或者”,“除非”等思想。&(与)、|(或)、!(非)、&&(短路与)、||(短路或)、^(异或)都是java中的逻辑运算符,具体用法见下表:
逻辑运算符 | 名称 | 示例 | 作用 |
---|---|---|---|
& | 与 | a & b | a,b都为真,则结果为真,反之,a,b都为假,则结果为假 |
| | 或 | a | b | a,b有一个为真,则结果为真 |
! | 非 | !a | a为真则结果为真,a为假则结果为假 |
&& | 与 | a && b | a,b都为真,则结果为真 |
|| | 或 | a || b | a,b有一个为真,则结果为真 |
^ | 异或 | a ^ b | a,b都为真,或都为假时,结果为假 |
&和&&
&与&&都表示逻辑与,它们的区别在于&
需要判断左右两边的值才能确定整个表达式的值。而&&
有时只需判断左边的值就可以确定整个表达式的值,当左边的值为false时,就不需要判断右边的值了,此时整个表达式的值为false
。当左边的值为true时,此时需要判断右边的值了,若右边的值为true,此时整个表达式的值为true,若右边的值为false时,此时整个表达式的值为false。
结合下面的代码可以有更好地理解:
/**
* @Description:
* @Author: 小强
* @Date: 2021/5/11 0011
* @Tools: IntelliJ IDEA
* @Remember: Be professional every day
**/
public class Demo01 {
public static void main(String[] args) {
if (A() & C()) { //A()方法和C()方法作逻辑与运算
System.out.println("结果是真!!!");
} else {
System.out.println("结果是假!!!");
}
}
public static boolean A() {
System.out.println("我是方法A");
return true;
}
public static boolean B() {
System.out.println("我是方法B");
return false;
}
public static boolean C() {
System.out.println("我是方法C");
return true;
}
}
上面的代码中定义了3个方法,A方法和C方法都返回true,B方法返回false,在主方法中使用if语句将A方法和C方法做逻辑与&运算,根据&的运算法则,需要判断左右两边的值才能确定整个表达式的值,A方法和C方法都为真,那么结果应该为真。执行结果如下:
从执行结果可以看到,控制台输出了A方法和C方法中的输出语句,说明&左右两边都执行了,还输出了“结果为真”,说明两边为真则结果为真。
同理,修改主方法中if语句中的表达式,将A方法和B方法做&运算,结果如下:
说明左右两边有一边为假,则结果为假。
交换if语句中A()和B()的位置,
public static void main(String[] args) {
if (B() & A()) {
System.out.println("结果是真!!!");
} else {
System.out.println("结果是假!!!");
}
}
执行结果如下:
接下来我们看&&逻辑运算符
修改主方法中if语句中的表达式,将A()方法和B()方法作&&(短路与)运算
public static void main(String[] args) {
if (A() && B()) {
System.out.println("结果是真!!!");
} else {
System.out.println("结果是假!!!");
}
}
执行结果如下:
将A()方法和B()方法位置调换:
public static void main(String[] args) {
if (B() && A()) {
System.out.println("结果是真!!!");
} else {
System.out.println("结果是假!!!");
}
}
只是调换了一下位置,结果就不一样了。是因为&&运算符在判断左边的值时,左边的值为false,就不用判断右边的值了,整个表达式的值为false。所以只执行了B方法中的输出语句,A方法没有执行。可以对比上面的A()和B()做&运算的结果(下图),&运算左右两边都执行了,&&只执行了左边。
| 和 ||
| 和 || 都表示逻辑或,其用法跟&和&&差不多, || 的运算法则是当左边的值为true时,就不用判断右边了,整个表达式结果为tru
。若左边为false,需要判断右边的值,右边为true,则整个表达式结果为true,右边为false,则则整个表达式结果为false。
结合代码理解,修改上面的代码:
public static void main(String[] args) {
if (A() | B()) {
System.out.println("结果是真!!!");
} else {
System.out.println("结果是假!!!");
}
}
结果如下:
| 运算一边为真,则结果为真。做 || 运算结果如下:
左边为true,右边不用判断,所以没有执行B方法。调换if中A()和B()的位置,结果如下:
左边为false,需要判断右边,右边为true,所以结果为true,两个方法都执行了。
逻辑运算符的优先顺序
逻辑非的优先级最高,逻辑与次之,逻辑或最低,即:!(非) → &&(与) → ||(或)
分析下面代码:
public static void main(String[] args) {
if (B() || A() && C()) {
System.out.println("结果是真!!!");
} else {
System.out.println("结果是假!!!");
}
}
若按照优先顺序,先运算 A() && C(),之后B()再和(A() && C())的结果做短路或(||)运算
执行结果:
执行的结果时按照左右顺序来的????????
我表示一脸懵!!待研究······