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

  • 本文关键字:运算符 一元 前缀 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?

因为如果第一个操作数是true,则||运算符将作为短路操作。

由于第一个操作数true(t == true(,因此不计算第二个条件(递增i(。

在第二种情况下,第一个操作数ffalse,因此计算第二个操作数,并且i递增2,以值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
  • b = (t & ((++i) == 0)); // b = true bitwise and 1 == 0 == false (prefix increment, so i gets incremented before evaluation --> false

((i++) == 0))从不求值,因为ttrue,而||是短路OR运算符,所以只有当第一个(左(操作数是false时,才会求值第二个(右(操作数。

(f || ((i += 2) > 0))中,由于f为false,因此对两个操作数进行求值。因此CCD_ 26从0递增到2。

最新更新