我期待输出为40但我得到30

时间:2016-07-28 05:34:28

标签: java operators

class Tester {
    public static void main(String[] arg) {
        byte b=10;
        b +=(b<127)?b>-128? b+=10 :0 :5;
        System.out.println(b);
    }
}

我知道条件已经过评估true并将控制权移至b+=10 所以现在逻辑上b+=b+=10;正在添加b和10的值,它计算20,分配给b。现在我无法进一步评估它。

2 个答案:

答案 0 :(得分:2)

JLS 15.7.1. Evaluate Left-Hand Operand First有一个类似的例子:

  

如果运算符是复合赋值运算符(第15.26.2节),则左侧操作数的计算包括 记住左侧操作数表示的变量< / strong>和获取并保存该变量的值以用于隐含二进制操作

     

例15.7.1-2。复合分配算子中的隐式左手操作数

     

在下面的程序中,两个赋值语句都提取并记住左侧操作数的值,即9,在加法运算符的右侧操作数之前评估,此时变量设置为3.

class Test2 {
    public static void main(String[] args) {
        int a = 9;
        a += (a = 3);  // first example
        System.out.println(a);
        int b = 9;
        b = b + (b = 3);  // second example
        System.out.println(b);
    }
}
  

该程序产生输出:

12
12

因此,在您的情况下,记住b(10)的原始值并将其添加到三元条件运算符的结果中(即20,因为b+=10的值是结果那个表达),给你30。

答案 1 :(得分:1)

首先评估(b<127) true b>-128? b+=10,然后移至b>-128部分 在此true被评估,它也是b+=10,因此它移动到b+=(b=20),这使得b = 20并且添加到表达式的左侧,其中值10存储在b.So中b=30生成vim