A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 宋浩 中级黑马   /  2012-6-8 12:38  /  2240 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

public class Test{
  public static void main(String args[]){
          boolean b1=test1(7)&&test2(4);
          boolean b2=test1(4)||test2(7);
          System.out.println("b1:"+b1+" b2:"+b2);
  }
  
  public static boolean test1(int n){
    System.out.println("这是第一个测试");
    return n<5;
  }
  
  public static boolean test2(int n){
    System.out.println("这是第二个测试");
    return n>3;
  }
}
为什么两次都好像没有执行到test2()方法?

11 个回复

倒序浏览
因为第一次test1(7) 是假  直接就返回假  && 第一个条件为假 直接返回假  不运算第二个条件
第二次test1(4)是真  直接就返回真了 ||  第一个条件为真 直接返回真  不运算第二个条件

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 曹昌 于 2012-6-8 12:49 编辑

public class Test{
  public static void main(String args[]){
          boolean b1=test1(7)&&test2(4);
          boolean b2=test1(4)||test2(7);
          System.out.println("b1:"+b1+" b2:"+b2);
  }
  
  public static boolean test1(int n){
    System.out.println("这是第一个测试");   第一次 7<5 flase,短路了,有一个假就是假就不执行了第二个了
    return n<5;
  }
  
  public static boolean test2(int n){
    System.out.println("这是第二个测试");  第二次 4>3 ture ,因为是双或 有一个为真 就是真了 不需要执行第二个
    return n>3;
  }



楼主看了这个会更明白:

&&&的区别:
共同点:二者都可以作为逻辑与的运算符,表示逻辑与,
不同点:&&有短路的功能,如果第一个表达式为false时,不需要进行第二个表达式的运算,
&操作符两边的表达式不是boolean类型时,表示按位与操作。Eg:我们通常使用0x0f来与一个整数进行&运算,获取低四位;

|||的区别:
|:无论左边的运算结果是什么,右边都参与运算。
||:当左边为真时,右边不参与运算的。

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
这就是&&和||的语法关系了,&& “且”关系,语法关系是两个同为真时才是true。如果第一个是false那第二个就不执行,总体直接为false。所以你代码中test1(7)后面的没执行。||只要一个为true总体就为true,你||中test1(4)为true所以后面的就没执行。
回复 使用道具 举报
这是java里的就近原则,在计算整个表达式值的过程中,一旦可以确定整个表达式的值,那表达式后面的不再执行。
回复 使用道具 举报
这两个都是短路的,之所以叫短路,从物理上的说法就是到这里就断掉了。

所以&& 它首先先判断前面是否为假,如果是假,那直接就不执行后面的。如果为真才判断后面的。
||  如果前面为真,那也不用判断后面的,如果为假才判断后面的。
这种短路的异或能提高运行的效率。


如果你想他两个都要判断到,那你可以用&  和  |
回复 使用道具 举报
&&短路与 ||短路或  的问题
当执行
boolean b1=test1(7)&&test2(4);  在此处 先执行test1(7)按照该函数定义 将返回false程序将直接将false赋予b1 不在执行test2()  即&&一处为假则为假
boolean b2=test1(4)||test2(7);   执行test1(4)返回真 则直接将 true返回 不在执行test2  即 || 一处为真 返回真
希望讲明白了
回复 使用道具 举报
本帖最后由 胡卿 于 2012-6-8 21:57 编辑

boolean b1=test1(7)&&test2(4);//  test1返回false,故test1&&test2被短路,test2不运行,直接返回假
boolean b2=test1(4)||test2(7););//  test1为真,故test1||test2为真,直接返回true。
因为运算是从左到右一步步进行,&&中有一个为假,就都为假,故后面不运行,被称为“短路
”。||中有一个为真,就返回true,后面也同样不运行。
回复 使用道具 举报
“&&”和“||”都是逻辑运算符,可以称之为短路运算符,
当“&&”运算符左边的表达式为false时,就不会去判断它右边的表达式,
但是“&”这个运算符不管左边表达式的值是什么,都回去判断右边的表达式的值,
“&&”相对于“&”运算效率会高一点。
“||”和“|”也是同样的道理。
回复 使用道具 举报
本帖最后由 wyl530274554 于 2012-6-9 19:29 编辑
  1. public class Test{
  2.         public static void main(String args[]){
  3.          boolean b1=test1(7)&&test2(4);        //test1(7)的结果为false;        false&&true(或false)均为false,所以test2(4)就不再执行
  4.          boolean b2=test1(4)||test2(7);          //同理,test2(7)也不再执行
  5.          System.out.println("b1:"+b1+" b2:"+b2);
  6.         }
  7.         
  8.         public static boolean test1(int n){
  9.          System.out.println("这是第一个测试");
  10.          return n<5;
  11.         }
  12.         
  13.         public static boolean test2(int n){
  14.          System.out.println("这是第二个测试");
  15.          return n>3;
  16.         }
  17. }
复制代码
&&(短路与)和||(短路或),运算特点:
    当表达式左边的计算结果能够决定整个表达式的结果时,右边的就不再执行
回复 使用道具 举报
对于&&,当运算符左边为假时,右边不运算,即“短路”,当运算符左边为真时,右边参与运算;对于||,当运算符左边为真时,右边不再运算,也出现“短路”,当运算符左边为假时,右边参与运算。对于楼主的代码,test1(7)结果为假,在&&运算中,运算符右边不再参与运算,不会执行test2(4);test(4)结果为真,在||运算中,运算符右边不再参与运算,所以也不会执行test2(7)。
回复 使用道具 举报
以下是关于逻辑运算符的一点总结,都是中文的,楼主应该只可以看的明白;      
                逻辑运算符用于连接boolean类型的表达式
        逻辑运算符用于连接boolean类型的表达式。
        true&true=true;
        true&false=false;
        false&true=false;
        false&false=false;
        &只要两边的boolean表达式结果,有一个为false.那么结果就是false.
        只有两边都true,结果为true.
        true|true=true
        true|false=true
        false|true=true
        false|false=false
        |只要两的boolean表达示结果有一个为真就是true.
        只有两边的都为假时才会false
        true|true=true
        true|false=true
        false|true=true
        false|false=false
        ^:两边都相同结果false结果不同为ture
        true|true=false
        true|false=true
        false|true=true
        false|false=false
        !非
        &和 &&的特点
        &无论是左边是真是假右边都运算。
        &&当左边为false时。右边不运算
        |和||的特点
        |两边都参与运算
        ||当左边为true时。右边不运算。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马