黑马程序员技术交流社区

标题: &和&&, | 和|| 的区别问题 [打印本页]

作者: 汪显晟    时间: 2013-9-20 21:30
标题: &和&&, | 和|| 的区别问题
本帖最后由 留不下什么 于 2013-9-21 13:48 编辑

&和&&的区别:
&& 当两边都为true与&没有区别;
当左边为true的时候与 & 也没有区别;
当左边为false的时候,则不需要右边参与运算,其结果一定为false;
& 和 && 都是两边都为true的时候才为true,只要有一边是false,就为false;
| 和 ||的区别:
||   当两边都为false的时候与 | 没有区别;
当左边为false的时候,与 | 也没有区别;
当左边为true的时候,那么右边不再需要进行运算,其结果一定为true;
| 和 || 都是两边都为false的时候才为false,只要有一边为true,就为true;


作者: 黄文伯    时间: 2013-9-20 21:35
亲,如问题已解决请将分类的“未解决”改为“已解决”。
以后的问题贴也要及时更改分类哦~
作者: 王清华0    时间: 2013-9-20 22:47
好吧,看到楼主这么好心的把这个问题解释出来,我也来顶顶帖子,发表一下我的看法。
之前一直觉得这个两种表达方式有什么区别么,短路(&&和||)和常规与或逻辑(&和|)反正都是判断表达式的对错。后来我看到一个问题和答案,才知道这种想法是错误的。因为对于java来说,&&和||后面可以是简单的布尔表达式,也可能是一个赋值语句甚至是一个布尔型函数,这样子一段代码的执行与否就有区别了。
我还是把问题写一下吧,这是当初云五的一个问题:
求1+2+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字以及条件判断语句(A?B:C)。
  1. class SumN {
  2.     private int result = 0;
  3.     private int sum;
  4.   
  5.     public int cal(int sum) {
  6.         this.sum = sum;
  7.         getSum(0);
  8.         return result;
  9.     }

  10.     public boolean getSum(int i) {
  11.         result = result + i;
  12.         boolean tag = (i != sum) && (getSum(i+1));
  13.         return tag;
  14.     }
  15. }

  16. public class Test {
  17.      public static void main(String[] args) {
  18.         SumN sumN = new SumN();
  19.         System.out.println(sumN.cal(100));
  20. }
  21. }
复制代码
这里利用短路的方式作为判断循环结束的条件,体现了短路在某些情况下的作用,当然这个问题是人为设定了比较严格的要求,但是一样可以作为我们的参考,也许在某些 特殊的情况下,短路也是比较有用的。
作者: aspoMAN    时间: 2013-9-20 22:53
学习了,楼主多多分享好东西




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