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。现在我无法进一步评估它。
答案 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