Java中有6中常见的逻辑运算符号:
&(逻辑与)、&&(短路与)
|(逻辑或)、||(短路或)
!(逻辑非)、^(逻辑异或)
逻辑关系如下图:
总结:
a&b和a&&b : a和b一样都是true才为true,其他都为false;
a|b和a||b : a或者b只有有一个为true,则为true;否则为false;
!a : 对a取反;
a^b :a和b一样的时候为false,不一样为true;
&与&&(|和||)虽然逻辑判断的结果一样,但是也有细微的差异,下面通过代码来体现
代码例题:
Demo1:
class AriTest3{
//测试&、&&、|、||的差异
//单个都行,双看符号左边
public static void singleX1(){
int x=1,y=1;
if(x++ == 2& ++y ==2){ //& 会将运算符左右都执行完,x++和++y都执行
x=7;
}
System.out.println("x ="+x+" y ="+y); //x =2 y =2
}
public static void doubleX1(){
int x=1,y=1;
if(x++ == 2&& ++y ==2){ //&& 如果&&左边false,那么只会将运算符左边的执行完,右边++y则不执行
x=7;
}
System.out.println("x ="+x+" y ="+y); //x =2 y =1
}
public static void singleS1(){
int x=1,y=1;
if(x++ == 1|++y ==1){ //| 会将运算符左右都执行完,x++和++y都执行
x=7;
}
System.out.println("x ="+x+" y ="+y); //x =7 y =2
}
public static void doubleS1(){
int x=1,y=1;
if(x++ == 1||++y ==1){ //|| 如果||左边true,那么只会将运算符左边的执行完,右边++y则不执行
x=7;
}
System.out.println("x ="+x+" y ="+y); //x =7 y =1
}
public static void main(String[] args){
singleX1(); //x =2 y =2
doubleX1(); //x =2 y =1
singleS1(); //x =7 y =2
doubleS1(); //x =7 y =1
}
}
从demo1可以看出,&与&&(|和||)虽然运行后x的值一样,但y的值却不一样,是由于&和&&(|和||)的差异造成的;&&(||)会存在“短路”情况,即&&左边为false时(||左边为true时),&&(||)运算符右边就不会执行,而&(|)无论怎样都会执行。
因而在写代码时,通常使用&&(||)来进行逻辑判断,代码执行的效率也会更高,
Demo2:
public class AriTest4{
/**
测试&&、&、前++、后++
*/
public static void demo1(){
boolean x=true;
boolean y=false;
short z=42;
if((z++==42)&&(y=true)) z++;
if((x=false) ||(++z==45)) z++;
System.out.println(z);
}
public static void demo2(){
boolean x=true;
boolean y=false;
short z=42;
if((z++==42)&&(y==true)) z++;
if((x=false) ||(++z==45)) z++;
System.out.println(z);
}
public static void main(String[] args){
demo1(); //46
demo2(); //44
}
}