Java中逻辑运算符为&&、||、!三种。运算对象必须是boolean类型。
而&(按位与)、|(按位或)、^(按位异或)也可以进行逻辑判断。当然进行逻辑判断的时候,同样运算对象也必须是boolean类型。要注意~(按位取反)不能参与逻辑运算。
&&和||我们称为具有短路特性的运算符。而&和|是非短路运算符。所以本篇将讨论&、|、^的逻辑判断。
&:和&&一样,全真则真,有假则假;我们通过下面一段代码来看两者之间的区别:
boolean logic = false;
int var = 1;
if(logic && ++var>1)
System.out.print(true);
else
System.out.print(false);
System.out.println("\t"+var);
if(logic & ++var>1)
System.out.print(true);
else
System.out.print(false);
System.out.println("\t"+var);
运行结果是
false 1
false 2,
就是说第一个逻辑判断时,由于logic为false,整个逻辑判断为false,所以&&后面的判断++var>1并未被执行,所以输出为1,但是第二个逻辑判断时,尽管logic为false,程序还是对&的++var>1进行了判断,所以输出为2。现在我们将logic的初始值改为true,输出结果为
true 2
true 3
意味着++var>1在两次逻辑判断中都执行了,即程序需判定所有表达式都要为true。现在我们对逻辑表达式做出如下修改:logic & ++var。运行结果为:
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
The operator && is undefined for the argument type(s) boolean, int
at logic.Logic.main(Logic.java:17)
运行结果报错。但是我们定义一个变量b = 2&++var,我们输出b的结果为:0。因此我们对于&可以得到以下结论:
1、&是非短路运算符,即使在前面的逻辑判断可以判定整个表达式的结果,程序依旧会执行&运算符后的全部表达式,每个独立的逻辑表达式都会执行完成后在一起进行&运算。如logic && ++var>1,先判定logic为false,再判定++var>1为false,最后综合两个表达式的结果,判定为false。
2、&在进行逻辑判断时,运算对象和&&一样必须全部为boolean。如果是boolean和其他类型的混合,则编译器会报错。
3、当运算对象全部为整型(或者可转化为整型)时,它是位运算符,不再构成逻辑运算。
|与&的使用方法类似,功能同||。
^的使用方法与&是一致的,都是非短路运算,但是功能跟!不同,^是异或。在逻辑判断中,当运算对象都是true或者都是false时,结果为false;当两者都不相同时,结果才为true。