黑马程序员技术交流社区
标题: &&与|| [打印本页]
作者: 宋浩 时间: 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 编辑
- public class Test{
- public static void main(String args[]){
- boolean b1=test1(7)&&test2(4); //test1(7)的结果为false; false&&true(或false)均为false,所以test2(4)就不再执行
- boolean b2=test1(4)||test2(7); //同理,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;
- }
- }
-
复制代码 &&(短路与)和||(短路或),运算特点:
当表达式左边的计算结果能够决定整个表达式的结果时,右边的就不再执行
作者: 刘煜 时间: 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 |