D中的减量操作有区别吗?

Jac*_*ack 0 d

我正在使用动态数组来实现我的堆栈.我写了pop如下:

int pop() {
        int n = arr[--arr.length];
        return n;
}
Run Code Online (Sandbox Code Playgroud)

使用上面的代码我Range violation在运行时遇到错误.但是使用以下代码:

int pop() {
        int n = arr[arr.length - 1];
        arr.length--;
        return n;
}
Run Code Online (Sandbox Code Playgroud)

它工作正常.我不明白为什么,对我来说两者都应该是等价的.我错过了什么?

编辑:也许这就是为什么--arr.length导致我要访问的元素被从数组中"删除"?

还有,push(N)就是这样arr ~= n;

ant*_*duh 5

你抓住它之前就删除了元素.您必须检索元素,然后减小数组的大小.

--arr.length减少数组的长度,然后返回新的缩小的大小.然后你尝试做int n = arr[arr.length].

这是一个简单的int n = arr[ --arr.length ]一个元素的工作:

  • arr.length = 1
  • 最后一个元素位于0位置
  • 评估 --arr.length
    • arr减少到零元素
    • arr.length返回0
  • 评估int n = arr[0].
    • arr是空的,休息.