Post前缀一元运算符奇怪的行为

时间:2015-09-16 13:00:03

标签: java

以下是我的代码。

public class ShortCkt {

    public static void main(String[] args) {
        int i = 0;
        boolean t = true;
        boolean f = false, b;
        b = (t || ((i++) == 0));// why the value of i does not gets increased?
        b = (f || ((i += 2) > 0));
        System.out.println(i);
    }

}

输出 2

为什么输出是2而不是3?

2 个答案:

答案 0 :(得分:4)

如果第一个操作数为||true运算符将作为短路运行。

由于第一个操作数 truet == true),因此不评估第二个条件(增加i)。

在第二种情况下,第一个操作数ffalse,因此第二个操作数被评估,i增加2,以值{{1}结束}}。

这与0 + 2 == 2运算符不同,后者需要对两个操作数进行求值。

在布尔条件中使用时,按位运算符&&&也会计算两个操作数。

<强>摘要

  • |
  • b = (t || ((i++) == 0)); // b = true OR... whatever, just true
  • b = (t | ((i++) == 0)); // b = true bitwise or 0 == 0 == true (postfix increment, so i gets incremented after evaluation --> true
  • b = (t | ((++i) == 0)); // b = true bitwise or 0 == 0 == true (prefix increment, so i gets incremented before evaluation --> false
  • b = (t && ((++i) == 0)); // b = true AND 1 == 0 == false (prefix increment, so i gets incremented before evaluation --> false

答案 1 :(得分:3)

((i++) == 0))永远不会被评估,因为ttrue||是一个短路的OR运算符,所以第二个(右)操作数仅在第一个被评估时被评估(左)操作数是false

(f || ((i += 2) > 0))中,两个操作数都被评估,因为f为false。因此i从0递增到2。