逻辑运算符用于操作两个布尔型的变量或常量。主要有以下几个。
- &&:与,前后两个操作数必须都是true才返回true,否则返回false。
- &:不短路与,作用与&&相同,但不会短路。
- ||:或,只要两个操作数中有一个是true,就可以返回true,否则返回false。
- |:不短路或,作用与||相同,但不会短路。
- ^:异或,当两个操作数不同时才返回true,如果两个操作数相同则返回false。
下面代码示范了各逻辑运算符的执行示意。
//5>3返回true,'6'转换为整数54,'6'>10返回true,求与后返回true。
System.out.println(5>3 && '6'>10);
//4>=5返回false,'c'>'a'返回true。求或后返回true。
System.out.println(4>=5||'c'>'a');
//4>=5返回false,'c'>'a'返回true。两个不同的操作数求异或返回true。
System.out.println(4>=5^'c'>'a')
对于|与||的区别,参考如下代码
//定义变量a、b,并为两个变量赋值
int a = 5;
int b =10;
//对a > 4 和b++ > 10 求或运算
if(a > 4 | b++ > 10){
//输出a的值是5,b的值是11
System.out.println("a的值是:"+a+",b的值是::"+b);
}
执行上面程序,看到输出a的值为5,b的值为11,这表明b++>10表达式得到了计算,但实际上没有计算的必要,因为a>4已经返回了true,则整个表达式一定返回true。
再看如下代码,只是将上面示例的不短路逻辑或改成了短路逻辑或。
//定义变量a、b,并为两个变量赋值
int c = 5;
int d =10;
//对c > 4 || d++ > 10 求或运算
if(c > 4 || d++ > 10){
//输出c的值是5,d的值是10
System.out.println("c的值是:"+c+",d的值是::"+d);
}
上面代码执行的结果是:c的值为5,而d的值为10。
对比两段代码,后面的代码仅仅将不短路或改为短路或,程序最后输出的d值不再是11,这表明表达式d++>10没有获得执行的机会。因为对于短路逻辑或 || 而言,如果第一个操作数返回true,||将不再对第二个操作数求职,直接放回true。不会计算d++>10这个逻辑表达式,因而d++没有获得执行的机会。因此,最后输出的d值为10。而不短路或 | 总是执行前后两个操作数。
&与&&的区别与此类似:&总会计算前后两个操作数,而&&先计算左边的操作数,如果左边的操作数为false,则直接返回false,根本不会计算右边的操作数。