你知道Java中&&和||放一个表达式中怎么执行吗?

2025-11-20 04:30:46

1、在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;

   }

}

你知道Java中&&和||放一个表达式中怎么执行吗?

2、看看执行结果:

Has invoked! I'm iAmFalse()

Main:Result is false

你知道Java中&&和||放一个表达式中怎么执行吗?

3、分析下原因:

只调用了前面的iAmFalse() 方法,小括号中方法一个也没有调用

不是说好的,小括号的优化级最高嘛。

是的,的确小括号的优化级最高,但并不是说小括号里的表达式先执行了!!

小括号内的表达式和 iAmFalse()使用&&连接,

因为小括号的优化级最高,因此小操作里面的iAmTrueNo1() || iAmTrueNo2()作为一个整体来运算

由于 iAmFalse()在&&运算符的左边,就先执行了。

因为iAmFalse()的返回值是false,&&有短路功能,从左到右运算,有一个为false就直接返回结果了。

你知道Java中&&和||放一个表达式中怎么执行吗?

4、为了验证刚才说的,把iAmTrueNo1() || iAmTrueNo2()外面的小括号去掉看看呢

Code:

if (iAmFalse() && iAmTrueNo1() || iAmTrueNo2()) {

你知道Java中&&和||放一个表达式中怎么执行吗?

5、看看执行结果:

Has invoked! I'm iAmFalse()

Has invoked! I'm iAmTrueNo2()

Main:Result is true

你知道Java中&&和||放一个表达式中怎么执行吗?

6、分析下原因:

iAmFalse() && iAmTrueNo1() || iAmTrueNo2()

上面这个表达式中涉及的操作符的优化级是一样的,

按照从左到右的原则,

(1)iAmFalse() && iAmTrueNo1()先运算

由于iAmFalse() 是false,按照&&的短路原则,表达式 iAmTrueNo1()就不用执行了,因为已经不影响结果了

(2)iAmFalse() && iAmTrueNo1() 的运算结果是fale,再一看,后面的运算符是||,要想得到整体表达式的结果,||后面的表达式仍然需要运算,

执行iAmTrueNo2(),结果是true

按照||操作符的原则,

false||iAmTrueNo2()的结果是true

你知道Java中&&和||放一个表达式中怎么执行吗?

7、按照上面的逻辑,不使用小括号,

if中表达式怎么改下顺序,才能让这三个函数都执行呢?

分析一下:

iAmFalse() 

 iAmTrueNo1()

  iAmTrueNo2()

三个表达式,2true 1false

&&和||都有短路功能,&&是遇到false知道,||是遇到true短路

因此能够触发短路的表达式不能放一块,

即iAmFalse() 不与使用&&与另外两个表达式相连

iAmFalse()只能使用||与其它表达式关联,

只有这一种形式:iAmFalse() ||true

如果上面表达式后面是||操作符,就触发短路操作了,因此只能是&&操作符

得到结果:

iAmFalse()||iAmTrueNo1()&&iAmTrueNo2()

(因此iAmTrueNo2()和iAmTrueNo1()的逻辑含义是一样的,当然也互换位置了)

Code:

if (iAmFalse() || iAmTrueNo1() && iAmTrueNo2()) {

你知道Java中&&和||放一个表达式中怎么执行吗?

8、执行下,看看执行结果与上面分析的是否一致

Has invoked! I'm iAmFalse()

Has invoked! I'm iAmTrueNo1()

Has invoked! I'm iAmTrueNo2()

Main:Result is true

OK,是一致的

O了

你知道Java中&&和||放一个表达式中怎么执行吗?

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢