黑马程序员技术交流社区

标题: 关于 | 和 || 的小问题..求解... [打印本页]

作者: 张吉日    时间: 2012-8-9 20:50
标题: 关于 | 和 || 的小问题..求解...
public class Demo22
{
        private static int j = 0;
        private static boolean methodB(int k)
        {
                j+=k;
                return true;
        }
        public static void methodA(int i)
        {
                boolean b;
                b = i < 10 |methodB (4);     //这一块 b = i<10 |methodB(4)这块是怎么进行比较的呢???????
                b = i < 10 ||methodB(8);       //这一块 —>同理,老师说这个就不用看了的,但是具体是怎么进行比较的???
        }
        public static void main(String args [])
        {
                methodA (0);
                System.out.println(j);
        }
}
//结果:4,

作者: 杨彪    时间: 2012-8-9 21:08
                //System.out.println(true|true);
                //System.out.println(true|false);
                //System.out.println(false|true);
                //System.out.println(false|false);

                //System.out.println(true||true);
                //System.out.println(true||false);
                //System.out.println(false||true);
                //System.out.println(false||false);
                //或操作,只要有一个为真(true),结果就为true
methodB (4)相当于你调用了methodB()这个方法 然后把4 传了进去  根据methodB()那个方法 得到 j=j+4

public class Demo22
{
        private static int j = 0;
        private static boolean methodB(int k) 4
        {
                j+=k; j=j+4
                return true;
        }
        public static void methodA(int i)
        {
                boolean b;
                b = i < 10 |methodB (4);     //这一块 b = i<10 |methodB(4)这块是怎么进行比较的呢???????
                b = i < 10 ||methodB(8);       //这一块 —>同理,老师说这个就不用看了的,但是具体是怎么进行比较的???
        }
        public static void main(String args [])
        {
                methodA (0);
                System.out.println(j);最后就输出:4
        }
}
作者: 曹晓涵    时间: 2012-8-9 21:09
本帖最后由 曹晓涵 于 2012-8-9 21:10 编辑

| 逻辑或
如,x|y,会对x, y都进行判断。
b = i < 10 |methodB (4);
虽然传入参数i=0满足i<10,但仍然会调用methodB(4)给j 赋值,j=4。
||短路或
如.x||y,只有当x为假的时候才会对y进行判断。若x为真,则不继续对y进行判断。
  b = i < 10 ||methodB(8);
因为传入参数i=0满足i<10,所以不会再调用methodB(8),j的值仍为4。
故最后打印输出的j 值为4。
作者: 杨彪    时间: 2012-8-9 21:10
刚才一弄的把标记弄错了  
                //System.out.println(true|true);
                //System.out.println(true|false);
                //System.out.println(false|true);
                //System.out.println(false|false);

                //System.out.println(true||true);
                //System.out.println(true||false);
                //System.out.println(false||true);
                //System.out.println(false||false);
                //或操作,只要有一个为真(true),结果就为true
methodB (4)相当于你调用了methodB()这个方法 然后把4 传了进去  根据methodB()那个方法 得到 j=j+4

public class Demo22
{
        private static int j = 0;
        private static boolean methodB(int k) 4
        {
                j+=k; j=j+4
                return true;
        }
        public static void methodA(int i)
        {
                boolean b;
                b = i < 10 |methodB (4);     //这一块 b = i<10 |methodB(4)这块是怎么进行比较的呢???????
                b = i < 10 ||methodB(8);       //这一块 —>同理,老师说这个就不用看了的,但是具体是怎么进行比较的???
        }
        public static void main(String args [])
        {
                methodA (0);
                System.out.println(j);最后就输出:4
        }
}
作者: 李知伦    时间: 2012-8-9 21:11
本帖最后由 李知伦 于 2012-8-9 21:25 编辑

|是非短路 或   会验证前后
||是短路 或    只要前面的为真就返回:真

同理  与
&     会验证前后
&&   只要前面的为假就返回:假

执行过程:
methodA (0);
b = i < 10 |methodB (4);    // 0<10|methobB(4), true|methodB(4), true|true(j=0+4), b=true
b = i < 10 ||methodB(8);    //0<10||mehodB(8), true||methodB(8), b=true


作者: 王舜民    时间: 2012-8-9 21:48
其实可以这么理解比较简单
a||b  a为真就不需要在执行b了, a||b已经为真
a|b   a为真任然需要执行b       两个都需要判断,

a&&b a为假 就不需要执行b了  a&&b已经为假,不需要执行b了
a&b   a为假 还需要执行b     a&b 为假
其实就是 a为真假的时候需不要要执行第二个条件b的差别
作者: 张吉日    时间: 2012-8-9 22:11
曹晓涵 发表于 2012-8-9 21:09
| 逻辑或
如,x|y,会对x, y都进行判断。
b = i < 10 |methodB (4);

我终于绕出来了  我太笨了 谢谢你啊
作者: 官文昌    时间: 2012-8-9 22:13
public class Test
{
        private static int j = 0;
        private static boolean methodB(int k)
        {
                j+=k;
                return true;
        }
        public static void methodA(int i)
        {
                boolean b;
                b = i < 10 |methodB (4);     //这个对于我们是没啥区别的,但是对于java虚拟机是有区别的,当是|时,java虚拟家两边的它都要运算,你传了个实参0给形参,i=0,i<10为 //true,又边调用methodB 方法,j=j+4,j=4;返回true,|l两边都为true,所以b=true。
                b = i < 10 ||methodB(8);       //当是||时,java虚拟机会先判断左边,如果左边为true时,它就不运算右边了结果返回true,这样就提高效率。i=0,i<10,为true,这时候虚拟机
//运行||右边的式子直接把true赋给b,这里面并没有调用methodB()方法。所以你最后的打印结果j=4的,而不是8
        }
        public static void main(String args [])
        {
                methodA (0);
                System.out.println(j);
        }
}

总结:|   两边都要参与运算
          ||  当左边为true时,右边不运算。







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