1.是什么
在Java中,逻辑运算符用于组合多个布尔表达式,并返回一个布尔结果。
(1)区分逻辑与(&)和短路与(&&)
相同点:判断两个布尔表达式是否都为true
。如果两个表达式都为true
,则整个表达式的结果为true
;否则,结果为false
。
不同点:短路与(&&)判断,如果第一个表达式为false
,则不会评估第二个表达式,因为整个逻辑与表达式的结果已经确定为false
。
举个例子吧!
①使用短路与(&&)判断
public class Test {
public static void main(String[] args) {
int a = 5;
int b = 8;
if (a < 1 && ++b > 7){
System.out.println("ok");
}
System.out.println(b);
}
}
这里由于第一个表达式是false,所以直接判定整个逻辑为false,b没有自增,输出结果为8。
②使用逻辑与(&)判断
public class Test {
public static void main(String[] args) {
int a = 5;
int b = 8;
if (a < 1 & ++b > 7){
System.out.println("ok");
}
System.out.println(b);
}
}
这里输出的结果是9,使用逻辑与(&)即使第一个操作数为false
,也会评估第二个操作数。
(2)区分逻辑或(|)和短路或(||)
相同点:判断两个布尔表达式是否至少有一个为true
。如果至少有一个表达式为true
,则整个表达式的结果为true
;如果两个表达式都为false
,则结果为false
。
不同点:短路或的判断中如果第一个操作数(布尔表达式)评估为true
,那么整个逻辑或表达式的结果就已经确定为true
,因此不会评估第二个操作数。这种短路行为可以避免不必要的计算,并且可以防止在第二个操作数中可能出现的错误或异常。
举个例子吧!
①使用短路或(||)判断
public class Test {
public static void main(String[] args) {
int a = 5;
int b = 8;
if (a > 1 || ++b > 10){
System.out.println("ok");
}
System.out.println(b);
}
}
由于第一个表达式是true,所以直接判定整个逻辑为true,“||”后面的条件不再执行,b没有自增,输出结果为8。
②使用逻辑或(|)判断
public class Test {
public static void main(String[] args) {
int a = 5;
int b = 8;
if (a > 1 | ++b > 10){
System.out.println("ok");
}
System.out.println(b);
}
}
使用逻辑或(|)即使第一个操作数为true,也会评估第二个操作数,输出结果为9。
(3)取反(!)
取反操作通常指的是逻辑非(!
)运算符,它用于反转布尔表达式的值。如果表达式为true
,逻辑非运算符将返回false
;如果表达式为false
,逻辑非运算符将返回true
。
下面将通过一个具体的例子来详细解释逻辑非(取反)运算符的使用。
public class Test {
public static void main(String[] args) {
boolean a = true;
System.out.println(!a);
}
}
结果:false
(4)逻辑异或(^)
逻辑异或运算符(^)用于对两个布尔值进行运算,其结果是当两个操作数不相同时为true
,相同时为false
。
操作数A | 操作数 B | 结果 (A ^ B) |
true | true | false |
true | false | true |
false | true | true |
false | false | false |
例题①:
public class Example {
public static void main(String[] args) {
boolean a = true;
boolean b = false;
// 使用逻辑异或运算符
boolean result = a ^ b; // 结果为 true,因为 a 和 b 不相同
System.out.println("a ^ b = " + result); // 输出:a ^ b = true
// 另一个例子
boolean c = true;
boolean d = true;
result = c ^ d; // 结果为 false,因为 c 和 d 相同
System.out.println("c ^ d = " + result); // 输出:c ^ d = false
}
}
例题②:
public class Test {
public static void main(String[] args) {
System.out.println((4<1)^(6>3));
}
}
结果:true
发现:
分析完后,小伙伴们有什么发现呢?在布尔逻辑中,&&
是更常用的符号,因为它提供了更高效的评估(短路行为)。而&
主要用于位操作,尽管它可以用于布尔逻辑,但通常不推荐这样做,因为它不具备短路特性,同理 || 也是如此!!!
趁热打铁!!!
练习1:
public class Test {
public static void main(String[] args) {
int x = 5;
int y = 5;
if (x++==6 & ++y==6){
x=11;
}
System.out.println("x="+x+",y="+y);
}
}
答案:x=6,y=6
解释:
总结:后缀自增的情况是先赋值再判断再自增!!!
练习2:
public class Test {
public static void main(String[] args) {
int x = 5;
int y = 5;
if (x++==6 && ++y==6){
x=11;
}
System.out.println("x="+x+",y="+y);
}
}
答案:x=6,y=5
练习3:
public class Test {
public static void main(String[] args) {
int x = 5;
int y = 5;
if (x++==6 | ++y==6){
x=11;
}
System.out.println("x="+x+",y="+y);
}
}
答案:x=11,y=6
练习4:
public class Test {
public static void main(String[] args) {
boolean x = true;
boolean y = false;
short a = 20;
if ((a++==20)&&(y=true)) a++;
if ((x=false)||(++a==23)) a++;
System.out.println("a="+a);
}
}
答案:a=24
提示:(=)是赋值操作不是等于(==)
好啦,本期干货就这些啦,小伙伴们还想补充什么就在评论区留言喔!