Sure:
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--];
- другими словами, если это индекс target , который выходит за пределы. К тому времени, когда это обнаружено, снижение уже произошло.