java - java中变量的赋值优先级
问题描述
我有一个代码片段示例
int i1 = 2;
int i2 = 3;
int i3 = i2 + (i2 = i1);
请谁能向我解释为什么i3
在这种情况下会用 5 初始化?我以为i2
之后(i2 = i1)
会是 2。然后i2 + i2
会是 4
解决方案
您犯了将运算符优先级与操作数评估顺序混淆的常见错误。
优先级仅影响表达式的结构(即含义)。由于您使用显式括号,因此毫无疑问i2 + (i2 = i1)
- 它不可能意味着(i2 + i2) = i1
.
然而,在 Java 中,操作数的计算总是从左到右。所以 `i2 + (i2 = i1)' 的意思是:
- 取 i2 的值,称之为 'tmp1'
- 取 i2 的地址,称之为 'tmp2'
- 取 i1 的值
- 将该值的副本存储在地址“tmp2”
- 将手头的值加到 'tmp1' 的值上
- 这是表达式的结果
这个序列只是说明性的,我并不是说这是编译器生成的实际目标代码。但它是如何理解你会得到什么结果。
但是,在实践中,您不希望编写将赋值组合到变量并使用变量的先前值的代码。如果我在做代码审查,我建议你重新制定。
推荐阅读
- c# - 剑道图表 - 显示当前列值与前一列值之间的列差异
- c# - 如何获取 XML 响应的值列表?
- windows-community-toolkit - 在 UWP DataGrid 中对数据进行分组
- sql - hive sql - 如何选择 hive 数组列中的前 n 个元素并返回所选数组
- python - 如何在连接和排序后显示初始值数组
- rust - 为什么在执行时未执行从 Future::poll() 调用的 async fn()?
- javascript - 在JS中将字符串转换为函数
- c# - 使用 mvvm 在 WPF 数据网格中的行单击事件
- c# - C# 字符串数组元素不更新
- java - 如何在 hql 请求中正确调用枚举方法?numberClass 和 symbolClass 是一个枚举