黑马程序员技术交流社区

标题: 新人请教关于&和&&的问题,有个疑惑,谢谢大家了! [打印本页]

作者: 武奇伟    时间: 2013-1-23 15:59
标题: 新人请教关于&和&&的问题,有个疑惑,谢谢大家了!
本帖最后由 张向辉 于 2013-1-23 19:57 编辑

正在看毕老师的第二天基础语法中的逻辑运算符部分,在学到&和&&的时候,看到课件上写的&和&&的区别是:1:单&时左边无论真假,右边都参与运算;
    2:双&时,如果左边为真,右边参与运算如果左边为假,那么右边不参与运算。
   但是在单&的时候,比如:
  1.         int x=2;
  2.         System.out.println(x>3&x<4);//结果是false
  3.         System.out.println(x>3&x<1);//结果是false
复制代码
怎么知道右边也参与运算了呢? 谢谢!
作者: 高浩    时间: 2013-1-23 16:09
&&是逻辑运算符,并且的关系,两边都成立才会成立
作者: 丁亚芝    时间: 2013-1-23 16:41
        int x=2;
        System.out.println(x>3&x<4);//结果是false
        System.out.println(x>3&x<1);//结果是false
左边false了,右边还是会判断的,但是左边false了,整个语句就是false的了,没法验证它右边仍旧参加判断,你记住就行了,
&左边false,右边依旧参加判断,false
&左边true,右边判断是false,则false,右边true则true
&&左边true,右边不管false还是true,就都是true了
作者: 武奇伟    时间: 2013-1-23 17:54
丁亚芝 发表于 2013-1-23 16:41
int x=2;
        System.out.println(x>3&x3&x

谢谢我知道了 int x=2;
                     System.out.println(x<3&x>4);//结果是false 这样就能证明右边参与运算了

作者: 谢毅    时间: 2013-1-23 18:14
你把代码稍微修改下就能看效果了
  1. int x = 2;
  2.                 System.out.println(x > 3 & x++ < 4);
  3.                 System.out.println(x);
复制代码

作者: 丁亚芝    时间: 2013-1-23 19:47
武奇伟 发表于 2013-1-23 17:54
谢谢我知道了 int x=2;
                     System.out.println(x4);//结果是false 这样就能证明右边参 ...

这是左边正确,右边参与,你不是为了证明左边错误,右边也参加判断嘛
左边正确,&&右边也参与,那还找什么区别
作者: 武奇伟    时间: 2013-1-23 19:52
谢毅 发表于 2013-1-23 18:14
你把代码稍微修改下就能看效果了

学习了 ,谢谢
作者: 武奇伟    时间: 2013-1-23 21:17
丁亚芝 发表于 2013-1-23 19:47
这是左边正确,右边参与,你不是为了证明左边错误,右边也参加判断嘛
左边正确,&&右边也参与,那还找什 ...

不好意思, 是我没说清楚, 谢谢你的回答, 我想问的是单&的时候, 无论左边是否正确, 右边都参与运算, 怎样证明右边都参与运算呢 ? 你只是说记住就可以了,其实我觉得谢毅的方法很好, 我提问中只是写了左边错误的情况, 而毕老师的结论是针对左边无论正确与否,右边都参与运算, 我是想证明右边是如何参与运算的, 后来我写的
int x=2;
System.out.println(x<3&x>4);//结果是false 这样就能证明右边参与运算了 思路是这样:因为左边正确,影响最终结果为false的原因就是右边的x>4参与了运算, 否则结果就应该是true了 我是这么想的 谢谢
作者: 耿文达    时间: 2013-1-25 14:50
这个帖子问得好,回答的也精妙,顶一个!
作者: 耿文达    时间: 2013-1-25 14:54
附上代码对比及运行结果:
                int x = 2;

        System.out.println(x > 3 & x++ < 4);

        System.out.println(x);

                int y = 2;

        System.out.println(y > 3 && y++ < 4);

        System.out.println(y);

结果:
false
3
false
2
说明:用&的代码,在第一个表达式判断为false后,继续判断并计算后面的表达式;而用&&的没有判断后面的,直接退出
作者: Gaara    时间: 2013-1-25 17:37
我也是个新手。。。。
但我觉得,像你说的这种例子应该是&和&&都是一样的。不作区分,应该也验证不了。JAVA语言设定有&和&&不是区分这种都一样的语句的。他应该有它存在的特定意义。&&只是比&效率高些。
而且&位运算中也会用到。所以我觉得逻辑运算中&&用的多些吧。。。。不知道我说的对不对。。。
作者: 胡勇敏    时间: 2013-1-25 21:44
本帖最后由 胡勇敏 于 2013-1-25 21:50 编辑

将右边写成变量自增的形式,在下面打印变量的值你就知道右边到底参与没有参与运算了。像下面这样:
  1. int x =1 ;
  2. int k =1 ;
  3. System.out.println(x > 3 & (x++ <5));
  4. System.out.println(x);
  5. System.out.println(k > 3 && (k++ <5));
  6. System.out.println(k);
复制代码
结果是:false
              2
              false
              1
也就是&的时候后面的x++执行了,而&&的时候k++未执行。就可以证明了。
这也是&与&&的一个区别,&&具有短路功能,而&则不具有。&&的这个特性还有个好处就是可以防止出现空指针异常比如:
  1. if(str != null && !str.equals(""))
复制代码
当str = null时就不会抛NullPointerException而如果把&&换做&的话就会抛NullPointerException





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