return stack [ - stp]; - 先发生哪种情况?是stp递减还是返回的元素?

时间:2010-11-19 14:55:14

标签: c++ stack

如果我的代码如下:

int pop()
{
    return stack[--stp];
}

我知道它正在做两件事。它返回元素'stp'中一维数组'stack'中包含的值。它也在递减'stp'。

但是这种情况发生在哪个顺序?

是否返回元素stp的值,然后递减stp

或者它是递减stp,然后返回现在由递减的stp引用的元素的值?

如果代码是:

int top()
{
    return stack[stp-1];
}

它有什么不同吗?

我很抱歉,我知道这是非常常见的编码风格 - 我仍然在理解简洁,未注释的代码时遇到一些麻烦 - 甚至是这样的基础知识。抱歉。

8 个答案:

答案 0 :(得分:7)

它会递减stp,然后在新stp值的位置返回数组中的值。

--stp是“前缀减量”,它被定义为递减参数(stp),然后返回新值。它有一个名为“postfix decrement”的对应物stp--,它递减stp然后返回旧的值 - 所以stack[stp--]将为您提供值当前stp偏移量,但仍然递减stp

最后,您的stack[stp-1]版本会返回与stack[--stp]相同位置的值,但stp本身将保持不变。

答案 1 :(得分:2)

简单回答:首先递减,然后是数组访问。

更复杂的答案:此代码使用前缀递减运算符,这是预递减。这意味着运算符的结果值是执行减量后的值

将此与后递减运算符进行对比。 return stack[stp--];也会递减stp,但使用的索引将是初始值。

由于复杂的技术原因,允许编译器最大限度地自由优化,因此在stp被修改时没有确切定义。但是肯定定义的是,用作数组索引的值是stp一旦递减就会具有的值。

top()的代码根本不会修改stp,但它在用作数组索引的值的意义上是相同的,它比{{1}的初始值小1。 1}}。因此,如果您致电stp,则您获得的价值与您下次致电top()时获得的价值相同。

答案 2 :(得分:1)

  • --stp =预先减少。 stp在使用之前递减。
  • stp-- =减少后。 stp在使用后递减。

答案 3 :(得分:1)

减量(和增量)运算符有两个版本,如--i和i--。如果您将它们视为函数(它们是函数),则代码将是(这假设您知道运算符重载是什么,否则请参阅HERE)。

// --i
int operator--() {
    *this = *this - 1;
    return *this;
}

// i--
int operator--(int i) {
   int retVal = *this;
    *this = *this - 1;
    return retVal;
}

所以,指出:

i--在减量之前返回值

- 我在减量之后返回值


至于

int top() { return stack[stp-1]; }

这将使索引返回一个小于stp的索引。但是,因为您没有为stp分配新值,所以stp在完成后将是相同的值(这可能不是您想要的)。

答案 4 :(得分:1)

return expression;表示“计算表达式并将结果返回给调用者”。函数返回其调用者后,您无法执行任何其他操作。首先返回呼叫者然后引起一些副作用是不可能的。

即使您已经写过return i++;或其他内容,它仍然意味着“评估表达式i++然后将结果返回给调用者”。恰好i++的结果是i在递增之前的值,但仍然i 递增。只需将i++视为(++i - 1)

答案 5 :(得分:0)

有两种类型的递增/递减操作:前缀和后缀。 使用前缀运算符时,首先执行操作,然后进行访问。在postfix中,第一个是访问,第二个是操作。

所以,在:

--stp;

stp将递减,然后被访问。

答案 6 :(得分:0)

如果代码是return stack[stp-1],则它的工作方式不同,即不修改stp。

答案 7 :(得分:0)

指令return stack[--stp];以下列方式工作:

  • 评估要返回的表达式
  • 返回评估结果

因此,stp的值递减。 至于你的其他问题,那就是

return stack[--stp];

相当于

return stack[stp-1];

取决于stp的性质。如果它是自动变量,则stp的更改无效。