编程语言要按人的逻辑处理各种问题,因此就会出现好多运算符来适应不同的场景。
复杂的场景,可能有多个运算符在一起的情况,这种情况有一点迷糊,就会搞错
本文就分享java语言中&&和||运算符在一块时,是怎么执行的
前期准备工作(包括相关工具或所使用的原料等)javaIntelliJ IDEA 详细的操作方法或具体步骤
在java中运算符&&和||的优先级是一样的。
看看这段代码的执行结果是什么
Show me the code.
Code:
package chapter4;
/**
* Created by MyWorld on 2016/3/20.
*/
public class OperatorAndOrDemo {
public static void main(String[] args) {
if (iAmFalse() && (iAmTrueNo1() || iAmTrueNo2())) {
System.out.println("Main:Result is true");
} else {
System.out.println("Main:Result is false");
}
}
private static boolean iAmTrueNo1() {
System.out.println("Has invoked! I'm iAmTrueNo1()");
return true;
}
private static boolean iAmTrueNo2() {
System.out.println("Has invoked! I'm iAmTrueNo2()");
return true;
} private static boolean iAmFalse() {
System.out.println("Has invoked! I'm iAmFalse()");
return false;
}
}

看看执行结果:
Has invoked! I'm iAmFalse()
Main:Result is false

分析下原因:
只调用了前面的iAmFalse() 方法,小括号中方法一个也没有调用
不是说好的,小括号的优化级最高嘛。
是的,的确小括号的优化级最高,但并不是说小括号里的表达式先执行了!!
小括号内的表达式和 iAmFalse()使用&&连接,
因为小括号的优化级最高,因此小操作里面的iAmTrueNo1() || iAmTrueNo2()作为一个整体来运算
由于 iAmFalse()在&&运算符的左边,就先执行了。
因为iAmFalse()的返回值是false,&&有短路功能,从左到右运算,有一个为false就直接返回结果了。

为了验证刚才说的,把iAmTrueNo1() || iAmTrueNo2()外面的小括号去掉看看呢
Code:
if (iAmFalse() && iAmTrueNo1() || iAmTrueNo2()) {

看看执行结果:
Has invoked! I'm iAmFalse()
Has invoked! I'm iAmTrueNo2()
Main:Result is true

分析下原因:
iAmFalse() && iAmTrueNo1() || iAmTrueNo2()
上面这个表达式中涉及的操作符的优化级是一样的,
按照从左到右的原则,
(1)iAmFalse() && iAmTrueNo1()先运算
由于iAmFalse() 是false,按照&&的短路原则,表达式 iAmTrueNo1()就不用执行了,因为已经不影响结果了
(2)iAmFalse() && iAmTrueNo1() 的运算结果是fale,再一看,后面的运算符是||,要想得到整体表达式的结果,||后面的表达式仍然需要运算,
执行iAmTrueNo2(),结果是true
按照||操作符的原则,
false||iAmTrueNo2()的结果是true

按照上面的逻辑,不使用小括号,
if中表达式怎么改下顺序,才能让这三个函数都执行呢?
分析一下:
iAmFalse()
iAmTrueNo1()
iAmTrueNo2()
三个表达式,2true 1false
&&和||都有短路功能,&&是遇到false知道,||是遇到true短路
因此能够触发短路的表达式不能放一块,
即iAmFalse() 不与使用&&与另外两个表达式相连
iAmFalse()只能使用||与其它表达式关联,
只有这一种形式:iAmFalse() ||true
如果上面表达式后面是||操作符,就触发短路操作了,因此只能是&&操作符
得到结果:
iAmFalse()||iAmTrueNo1()&&iAmTrueNo2()
(因此iAmTrueNo2()和iAmTrueNo1()的逻辑含义是一样的,当然也互换位置了)
Code:
if (iAmFalse() || iAmTrueNo1() && iAmTrueNo2()) {

执行下,看看执行结果与上面分析的是否一致
Has invoked! I'm iAmFalse()
Has invoked! I'm iAmTrueNo1()
Has invoked! I'm iAmTrueNo2()
Main:Result is true
OK,是一致的
O了

- 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
-
