java - 它的正确答案是 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
评估(并保存)到5
左侧,然后在右侧评估。右侧确实计算为,但因为左侧仍然是,所以总和是,不是。a++
++a
17
5
22
24
推荐阅读
- java - How can I access the text of the SMS sent thru Twilio to my Spring Boot Controller?
- godot - Godot - 父母可以与其孩子共享 CollisionShape 吗?
- html - 如何制作圆形边框角(不是圆角)
- python - 如何在任何 JIRA 上添加仅限团队成员的评论
- arduino-esp8266 - 将 Aurdiuno ESP-01 wifi 与 LED 矩阵 MAX7219 连接
- json - 如何在按钮 id 中传递一个变量,然后将该 id 发送到 ajax 数据?
- javascript - TypeError:不是构造函数
- laravel - 如何同时使用 Laravel 认证和 vue-router
- java - 在双变量点后删除数字(Java)
- c - 为什么 getchar() 返回垃圾值?