我遇到了一个相当特殊的简写符号:A[j+1] = A[j--]
此行似乎执行了两项操作:move A[j] right and decrement j
是否可以将其分解为单独的步骤以帮助我理解简写?
伪代码:
n=A.length
for i <- 1 to n-1
curr = A[i]
j = i - 1
while j >= 0 && A[j] > curr
A[j+1] = A[j--]
A[j+1] = curr
答案 0 :(得分:2)
不确定
int targetIndex = j + 1;
int tmp = j;
j--;
A[targetIndex] = A[tmp];
请注意targetIndex
在发生任何其他事件之前计算 - 在右侧之前有效确定赋值运算符的左侧。
然而,在赋值本身发生之前,甚至在评估右手数组访问之前,发生了递减。您可以在此示例代码中看到:
public class Test {
public static void main(String[] args) {
int[] x = { 0, 1, 2, 3, 4 };
int j = 3;
try {
x[j + 1] = x[j-- + 10];
} catch (Exception e) {
System.out.println("Caught exception");
}
System.out.println(j); // Prints 2
}
}
在这里,您可以看到j
已经减少,即使分配本身不能发生。
实际上,如果我们使用x[j + 10] = x[j--];
,就会发生同样的情况 - 换句话说,如果它是超出界限的目标索引。到发现时,已经发生了减量。
答案 1 :(得分:2)
由于在您的示例中,j
始终小于A.length
A[j+1] = A[j--];
与
相同int index = j + 1;
A[index] = A[j];
j = j - 1;
如以下程序所示:
import java.util.Arrays;
public class Test {
public static void main(String[] args) {
int[] A = { 1, 2, 3, 4, 5 };
int j = 2;
A[j+1] = A[j--];
// prints: [1, 2, 3, 3, 5]
System.out.println(Arrays.toString(A));
}
}
答案 2 :(得分:0)
我不知道我是否理解你的问题,但如果你不确定j--符号,请尝试我的例子。显示-j和j--之间的区别 - 它可以在将来帮助你:
public static void main(String[] args) {
int j = 10;
System.out.println("Current=" + j);
System.out.println(j--);
System.out.println("Current=" + j);
System.out.println(--j);
System.out.println("Current=" + j);
}
<强>输出:强>
Current=10
10
Current=9
8
Current=8