首页 > 解决方案 > 它的正确答案是 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

标签: javaoperators

解决方案


与所有复合运算符一样,运算符首先+=计算左边的变量,然后计算所有其他操作数,然后再实际执行任何操作。这是由JLS 第 15.26.2 节规定的:

如果左侧操作数表达式不是数组访问表达式,则:

  • 首先,评估左侧操作数以产生变量。如果这个求值突然完成,那么赋值表达式也会因为同样的原因而突然完成;不计算右侧操作数,也不发生赋值。
  • 否则,将保存左侧操作数的值,然后计算右侧操作数。如果这个求值突然完成,那么赋值表达式也会因为同样的原因而突然完成并且没有赋值发生。
  • 否则,左侧变量的保存值和右侧操作数的值用于执行复合赋值运算符指示的二元运算。如果此操作突然完成,则赋值表达式出于同样的原因突然完成并且不发生赋值。
  • 否则,二元运算的结果被转换为左侧变量的类型,经过值集转换(第 5.1.13 节)到适当的标准值集(不是扩展指数值集),结果转换的存储到变量中。

(粗体强调我的)

这意味着在左侧a评估(并保存)到5左侧,然后在右侧评估。右侧确实计算为,但因为左侧仍然是,所以总和是,不是。a++++a1752224


推荐阅读