黑马程序员技术交流社区

标题: &&与|| [打印本页]

作者: 宋浩    时间: 2012-6-8 12:38
标题: &&与||
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()方法?
作者: 黑马张扬    时间: 2012-6-8 12:45
因为第一次test1(7) 是假  直接就返回假  && 第一个条件为假 直接返回假  不运算第二个条件
第二次test1(4)是真  直接就返回真了 ||  第一个条件为真 直接返回真  不运算第二个条件
作者: 曹操    时间: 2012-6-8 12:45
本帖最后由 曹昌 于 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来与一个整数进行&运算,获取低四位;

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


作者: 吴小铁你好    时间: 2012-6-8 12:47
这就是&&和||的语法关系了,&& “且”关系,语法关系是两个同为真时才是true。如果第一个是false那第二个就不执行,总体直接为false。所以你代码中test1(7)后面的没执行。||只要一个为true总体就为true,你||中test1(4)为true所以后面的就没执行。
作者: 赵兵锋    时间: 2012-6-8 12:50
这是java里的就近原则,在计算整个表达式值的过程中,一旦可以确定整个表达式的值,那表达式后面的不再执行。
作者: 杨天皓    时间: 2012-6-8 12:52
这两个都是短路的,之所以叫短路,从物理上的说法就是到这里就断掉了。

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


如果你想他两个都要判断到,那你可以用&  和  |
作者: 麦田守望者0812    时间: 2012-6-8 20:08
&&短路与 ||短路或  的问题
当执行
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:53
本帖最后由 胡卿 于 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,后面也同样不运行。

作者: 吴扬    时间: 2012-6-9 19:05
“&&”和“||”都是逻辑运算符,可以称之为短路运算符,
当“&&”运算符左边的表达式为false时,就不会去判断它右边的表达式,
但是“&”这个运算符不管左边表达式的值是什么,都回去判断右边的表达式的值,
“&&”相对于“&”运算效率会高一点。
“||”和“|”也是同样的道理。
作者: 黑马-王言龙    时间: 2012-6-9 19:26
本帖最后由 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. }
复制代码
&&(短路与)和||(短路或),运算特点:
    当表达式左边的计算结果能够决定整个表达式的结果时,右边的就不再执行

作者: 刘煜    时间: 2012-6-9 21:05
对于&&,当运算符左边为假时,右边不运算,即“短路”,当运算符左边为真时,右边参与运算;对于||,当运算符左边为真时,右边不再运算,也出现“短路”,当运算符左边为假时,右边参与运算。对于楼主的代码,test1(7)结果为假,在&&运算中,运算符右边不再参与运算,不会执行test2(4);test(4)结果为真,在||运算中,运算符右边不再参与运算,所以也不会执行test2(7)。
作者: 邓杰    时间: 2012-6-9 21:21
以下是关于逻辑运算符的一点总结,都是中文的,楼主应该只可以看的明白;      
                逻辑运算符用于连接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时。右边不运算。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2