【问题标题】:What's the order of evaluation for this line assuming i=0 and all elements of array are initialized to 0 a[i++] = a[i++] + 2;假设 i=0 并且数组的所有元素都初始化为 0 a[i++] = a[i++] + 2;
【发布时间】:2019-12-12 10:43:44
【问题描述】:

我在简而言之的java中遇到了这行代码,我想知道编译器如何划分这段代码

a[i++] += 2;
a[i++] = a[i++] + 2;

【问题讨论】:

  • 我明白 j=i++;将评估为 j=i ; i=i+1;这两行呢
  • 另外,根据您运行的 java 的确切版本,this question(和this bug)可能很重要

标签: java assignment-operator post-increment


【解决方案1】:

15.26.1。简单赋值运算符 =

如果左侧操作数是数组访问表达式(第 15.10.3 节),可能包含在一对或多对括号中,则:

首先,计算左侧操作数数组访问表达式的数组引用子表达式。如果这个求值突然完成,那么赋值表达式也会因为同样的原因而突然完成; (左侧操作数数组访问表达式的)索引子表达式和右侧操作数不会被计算,也不会发生赋值。

否则,计算左侧操作数数组访问表达式的索引子表达式。如果这个求值突然完成,那么赋值表达式也会因为同样的原因而突然完成,右边的操作数不会被求值,也不会发生赋值。

https://docs.oracle.com/javase/specs/jls/se12/html/jls-15.html#jls-15.26.1

我假设评估的顺序应该如下

a[i++] = a[i++] + 2;
  ^      ^ ^
  1      3 2
         ----------
             ^
             4
------
  ^
  5
--------------------
         ^
         6

我们可以通过运行这个 sn-p 来证明它

int[] a = {0, 10, 0, 0};
int i = 0;
a[i++] = a[i++] + 2;

System.out.println(Arrays.toString(a)); // [12, 10, 0, 0]
System.out.println(i);                  // 2

【讨论】:

  • 需要指出的一个(也许)有趣的事情是,i++s 都在数组取消引用发生之前进行了评估。如果您定义int[] a = null;,将“有趣”行包装在try/catch 中(以捕获NPE),在结果2 之后打印i。坦率地说,一个奇怪的结果是您可以分配数组after 你在 LHS 上引用了它:a[i++] = (a = new int[2])[i++];,LHS 上使用的a 是新分配的。
猜你喜欢
  • 1970-01-01
  • 2017-06-19
  • 1970-01-01
  • 1970-01-01
  • 2019-10-11
  • 2014-09-17
  • 2019-04-19
  • 2022-01-05
  • 1970-01-01
相关资源
最近更新 更多