数组内的自增运算符

Increment operator inside array

我有一个 C 程序,它使用数组进行队列操作。在那个程序中,他们增加了数组中的一个变量。我不明白这是怎么回事。那么,请解释一下这些操作:

array[++i];
array[i++];

Please explain these operations.

  1. array[++i]; - 首先递增 i,然后在递增索引

    处为您提供元素

    相当于:

    ++i; // or i++
    array[i];
    
  2. array[i++]; - 也首先递增 i,但后缀 operator++ returns i 的值在递增之前

    相当于:

    array[i];
    ++i; // or i++
    

They increment a variable inside array.

不,他们没有。您可以说它们在对数组下标运算符的调用中递增 i

数组[++i]; - 递增 i 的值,然后使用递增的值作为数组

的索引

数组[i++]; -索引到数组中,然后递增 i

的值

++i 递增 i 评估它之前。

i++ 在 评估后 i 进行了改进。

如果 i=1array[++i] 设置 i=2 然后获取 array[2].

If i=1 then array[i++] fetchs array[1] then sets i=2.

post- 和预运算发生在之后之前 它们所涉及的表达式是求值。

我通常不鼓励在表达式中使用 post 和预递增运算符。它们最好的情况下会导致混乱,最坏的情况下会导致错误。

考虑 x = array[++i] + array[i--] ; 应该是什么。看看让程序员(或必须修复您的代码的可怜虫?:-))感到困惑是多么容易。

Post 和预递增和递减操作也会在宏中产生问题,因为您最终可能会多次重复某个操作,尤其是对于宏。

它更简单并且更易于维护代码以避免 post 和表达式中的预递增,IMO。

所以,你知道 i++++ii 加 1。另外,这个指令 returns i,所以你可以把这个在您的代码中某处您需要 i.

的值

两者的区别在于i++是post增量,而++i是预增量。这是什么意思?

好吧,假设 i 是 6。当你这样做时:

array[i++]
array[i]

你实际上会做:

array[6]
array[7]

因为您使用 post 递增:首先 return 值,然后递增 i

如果你这样做:

array[++i]
array[i]

你基本上会做:

array[7]
array[7]

因为你使用预递增:首先递增i,然后return它的值。

现在尝试找出您的代码的作用 ;-)

希望这对您有所帮助。

我知道你的问题是在队列的上下文中,但我将使用堆栈来说明。

想象一个基于数组的堆栈:

T stack[N];     // for some type T
size_t sp = N;  // stack pointer

在此示例中,堆栈增长 "downwards",其中索引 N-1 是堆栈底部,索引 0 是顶部。

推送操作如下所示:

stack[--sp] = val;

--sp 的计算结果为 sp - 1,并且作为 副作用 递减 sp 中的值,因此上述语句等效于写作

stack[sp - 1] = val;
sp = sp - 1;

注意 sp 可能会在作业完成前更新。

弹出操作如下所示:

val = stack[sp++];

sp++ 评估 sp 的当前值,并且作为副作用增加 sp 中的值,所以它等同于写

val = stack[sp];
sp = sp + 1;

与上述警告相同。