它的正确答案是22。但我得到了24。我错在哪里?我在最后评估赋值运算符+=,因为它具有最低的优先级
class Output
{
public static void main (String[] args)
{
int a = 5;
a += 5+ (++a) + (a++);
System.out.print(a);
}
}
评估:
a += 5 + (++a) + (a++)
=> a+= 5 + 6 + (a++) [++a :increment value of a and then use it. So:increment a = 6, then use a=6]
=> a+= 5 + 6 + 6 [a++ :use and then increment value of a. So: use a=6, then increment a=7]
=> a+= 11 + 6
=> a+= 17
=> a = a+17
=> a = 7 + 17
=> a = 24
回答
的+=操作者,像所有的化合物的运营商,计算左侧变量第一,评估所有其它操作数之前,和之前实际执行任何操作。这由JLS 第 15.26.2 节规定:
如果左操作数表达式不是数组访问表达式,则:
- 首先,评估左边的操作数以产生一个变量。如果这个评估突然完成,那么赋值表达式也会因为同样的原因突然完成;不计算右侧操作数,也不进行赋值。
- 否则,保存左侧操作数的值,然后评估右侧操作数。如果此评估突然完成,则赋值表达式会出于相同的原因突然完成,并且不会发生赋值。
- 否则,左侧变量的保存值和右侧操作数的值用于执行复合赋值运算符指示的二元运算。如果此操作突然完成,则赋值表达式会出于同样的原因突然完成,并且不会发生赋值。
- 否则,二元运算的结果被转换为左侧变量的类型,经过值集转换(第 5.1.13 节)到适当的标准值集(不是扩展指数值集),结果转换的结果存储到变量中。
(粗体强调我的)
这意味着在和之前在左侧a评估(并保存)到右侧。右侧的计算结果为,但因为左侧仍然是,所以总和是,不是。5a++++a1752224
THE END
二维码