逻辑运算符
逻辑运算符是对布尔型变量进行运算,其结果也是布尔型。
逻辑与&&、逻辑或||、逻辑非!
逻辑运算符的优先级为:!运算级别最高,&& 运算高于 || 运算。!运算符的优先级高于算术运算符,而 && 和 || 运算则低于关系运算符。结合方向是:逻辑非(单目运算符)具有右结合性,逻辑与和逻辑或(双目运算符)具有左结合性。
其中逻辑与&&和逻辑或||也可称为短路操作符(条件操作),采用短路的方式,可以提高我们的效率。从左到右计算,如果确定值则不会再计算下去。
“&&”运算符检查第一个表达式是否返回“false”,如果是“false”则结果必为“false”,不再检查其他内容。以下代码java会报异常:
Exception in thread “main” java.lang.ArithmeticException: / by zero
public class Test1 {
public static void main(String[] args) {
int a = 10;
if(a>1/0&&a>1) {
System.out.println("Hello");
}else {
System.out.println("World");
}
}
}
但如果将a>1与a>1/0调换以下位置,程序则会输出World,不再检查后面明显错误的1/0了
“||”运算符检查第一个表达式是否返回“true”,如果是“true”则结果必为“true”,不再检查其他内容。
public class Test1 {
public static void main(String[] args) {
int a = 10;
if(a>1||a<1/0) {
System.out.println("Hello");
}
}
}
上述代码1/0明显错误, 但“||”先执行a>1的运算,返回true,所以短路了,不再检查后续代码。
位运算符
位运算符主要针对二进制,它包括了:“& 按位与”、“~按位非”、“| 按位或”、“^ 按位异或”。从表面上看似乎有点像逻辑运算符,但逻辑运算符是针对两个关系运算符来进行逻辑运算,而位运算符主要针对两个二进制数的位进行逻辑运算。
& 按位与:只要有一个为false,就返回false。
~按位非:不是false就返回true,不是true,就返回false
| 按位或:只要有一个为true,就返回true。
^ 按位异或:如果两个相同,就返回false,否则就返回true
“& 按位与”、“| 按位或”、“^ 按位异或”也可称为非短路运算符。
public class Test1 {
public static void main(String[] args) {
int a = 10;
if(a>1&a<1/0) {
System.out.println("Hello");
}
}
“&”会检查每一个表达式,虽然a>1已经返回true,但还是会检查其它内容,所以最后代码会报错,其它几个位运算符跟&的处理机制相同。
短路运算符(&&、||)只能用于逻辑表达式内,只能操作布尔型的。非短路运算符(&、|、^)可用于位表达式和逻辑表达式内,不仅可以操作布尔型,而且可以操作数值型。