目录
- 一、||和|的异同
- 二、&&和&的异同
- 三、复杂的例子
一、||和|的异同
- 相同点:||和|都可以用作逻辑或的运算符,表示逻辑与(or),只要有一方为true,则结果为true。否则,当运算符两边的表达式的结果都为false时,整个运算结果才为false。
- 区别:”||“执行过程中会出现“短路”的现象。即若符号”||”前的表达式如果为true,那么后面的那个表达式将不会被执行,直接返回true。
- 示例代码:
//int i = 0, j = 1;
//”||“执行过程中会出现“短路”的现象。即若符号”||”前的表达式如果为true,那么后面的那个表达式将不会被执行,直接返回true。
//if (i == 0 || ++j > 0) j不会增长,if (i == 0 | ++j > 0) j会增长
int i = 0, j = 1;
if (i == 0 || ++j > 0) {
System.out.println("j=" + j); //输出j=1,即未执行 ++j > 0语句
}
if (i == 232 || ++j > 0) {
System.out.println("j=" + j); //输出j=2,执行++j > 0该语句
}
j=1;
if (i == 0 | ++j > 0) {
System.out.println("j=" + j); //输出j=2,执行 ++j > 0语句
}
结果:
二、&&和&的异同
符号”&&”和符号”&”与”||“和“|”同理
- 相同点:&和&&都可以用作逻辑与的运算符,表示逻辑与(and),当运算符两边的表达式的结果都为true时,整个运算结果才为true。否则,只要有一方为false,则结果为false。
- 区别:&&还具有短路的功能,即如果第一个表达式为false,则不再计算第二个表达式,例如,对于if(str != null && !str.equals(“”))表达式,当str为null时,后面的表达式不会执行,所以不会出现NullPointerException如果将&&改为&,则会抛出NullPointerException异常。
示例代码:
//int i = 0, j = 1;
//&&还具有短路的功能,即如果第一个表达式为false,则不再计算第二个表达式
//if (i == 232 && ++j > 0) j不会增长,if (i == 232 & ++j > 0) j会增长
int i = 0, j = 1;
if (i == 232 && ++j > 0) {
System.out.println("测试!!!");
} else {
System.out.println("j=" + j); //输出j=1,即未执行 ++j > 0语句
}
if (i == 0 && ++j > 0) {
System.out.println("j=" + j); //输出j=2,执行++j > 0该语句
}
j = 1;
if (i == 232 & ++j > 0) {
System.out.println("测试!!!");
} else {
System.out.println("j=" + j); //输出j=2,执行 ++j > 0语句
}
结果:
三、复杂的例子
理解了这些,你就能明白我下面的第二段代码为啥删去一些判断表达式
boolean b = (i == 0 && j != 0) || (i == 0 && j == 0);
当j != 0
为true时,因为||的短路特性,就不会计算||之后的逻辑表达式,会直接返回true。所以当计算||之后的逻辑表达式时,j!=0
肯定为false,即j==0
肯定为true。
||之后的逻辑表达式相当于(i == 0 &&true)
,而(i == 0 &&true)
等价于i==0
boolean b = (i == 0 && j != 0) || (i == 0);