代码之家  ›  专栏  ›  技术社区  ›  Ankit Sachan

为什么&&,&,| |的输出不同?

  •  6
  • Ankit Sachan  · 技术社区  · 16 年前

    你能解释为什么输出是不同的吗

    1)

    public static ShortCkt {
        public static void main(String args[]) {
            int i = 0;
            boolean t = true;
            boolean f = false, b;
            b = (t && ((i++) == 0));
            b = (f && ((i+=2) > 0));
            System.out.println(i);      
        }
    }
    

    这种情况下的输出是1

    2)

    public static ShortCkt {
        public static void main(String args[]) {
            int i = 0;
            boolean t = true;
            boolean f = false, b;
            b = (t & ((i++) == 0));
            b = (f & ((i+=2) > 0));
            System.out.println(i);      
        }
    }
    

    3)

    public static ShortCkt {
        public static void main(String args[]) {
            int i = 0;
            boolean t = true;
            boolean f = false, b;
            b = (t || ((i++) == 0));
            b = (f || ((i+=2) > 0));
            System.out.println(i);      
        }
    }
    

    4)

    public static ShortCkt {
        public static void main(String args[]) {
            int i = 0;
            boolean t = true;
            boolean f = false, b;
            b = (t | ((i++) == 0));
            b = (f | ((i+=2) > 0));
            System.out.println(i);      
        }
    }
    

    这种情况下的输出是3

    5 回复  |  直到 14 年前
        1
  •  12
  •   aioobe    16 年前

    && 被评价为“懒惰”而 &

    如果 a a && b 将返回false,甚至不进行评估 b

    同样的道理 a || b :如果第一个操作数, 是真的,整个表达式是真的,第二个操作数, b 从未评估过。为了 a | b 一 和 b 将进行评估。

    如果在使用 && || )有副作用,如你的例子。


    ^ (xor)也适用于布尔运算(A ^^ 版本不存在只是因为它是多余的。)

        2
  •  7
  •   Community Mohan Dere    9 年前

    有4个 boolean 我们在这里关注的二元运算符:

    • &&
      • &
    • || 是条件运算符还是运算符
      • |

    关键是:

    • “conditional”表示它短路:如果不影响运算结果,它就不会计算正确的操作数
    • “逻辑”不短路:它计算两个操作数,先左后右。
    • “and”的结果是 true 仅当两个操作数都是
      • 如果左操作数是 false ,结果是 假 不考虑右操作数
    • “或”的结果是 是的 仅当至少有一个操作数是
      • 如果左操作数是 ,结果是 是的 不考虑右操作数

    换句话说,假设没有例外等:

    • & 和 总是 计算两个操作数
    • && 和 计算正确的操作数 有条件地 ; 只有当右操作数的值可能影响二进制运算的结果时,才会对其求值。这意味着在以下情况下不计算右操作数:
      • && 计算结果为 假
        • 假 )
      • 的左操作数 || 是的
        • (因为无论右操作数的计算结果是什么,整个表达式都是 是的

    工具书类

    另请参见

    相关问题

        3
  •  1
  •   Dave McClelland    16 年前

    && || 是逻辑AND和OR运算符,它们总是导致 boolean 表情。 & 和 | 是位AND和OR运算符,它们对每边进行位比较。有关这些运算符所做操作的更多信息,请参阅 this link

        4
  •  1
  •   Polymorphix    16 年前

    这是因为&&和| |是逻辑运算符,是一种“短路机制”。如果您使用| |,并且第一个表达式的计算结果为true,则第二个表达式将不会被计算,因此我将不会被udate&和|是对输入进行位计算的位运算符。这些表达式没有短循环,因此无论发生什么情况,都会计算整个表达式。

        5
  •  1
  •   Mark Elliot    16 年前

    这个 & | 运算符是按位的,因此必须先计算表达式的两侧,然后才能使用运算符,因此在情况2和4中,运算符的两侧都是 总是 评价的。

    案例1和案例3之间的区别基于短路逻辑。

    在案例1中 && 第二个表达式中的运算符短路为 false 一开始 假 ,导致不计算表达式的后半部分。

    在案例3中 假 i . false || expr 只能是 假 如果 expr