如果我的代码如下:
int pop()
{
return stack[--stp];
}
我知道它正在做两件事。它返回元素'stp'中一维数组'stack'中包含的值。它也在递减'stp'。
但是这种情况发生在哪个顺序?
是否返回元素stp
的值,然后递减stp
?
或者它是递减stp
,然后返回现在由递减的stp
引用的元素的值?
如果代码是:
int top()
{
return stack[stp-1];
}
它有什么不同吗?
我很抱歉,我知道这是非常常见的编码风格 - 我仍然在理解简洁,未注释的代码时遇到一些麻烦 - 甚至是这样的基础知识。抱歉。
答案 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
的更改无效。