数组内的自增运算符
Increment operator inside array
我有一个 C 程序,它使用数组进行队列操作。在那个程序中,他们增加了数组中的一个变量。我不明白这是怎么回事。那么,请解释一下这些操作:
array[++i];
array[i++];
Please explain these operations.
array[++i];
- 首先递增 i
,然后在递增索引
处为您提供元素
相当于:
++i; // or i++
array[i];
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=1
则 array[++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++
和 ++i
将 i
加 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;
与上述警告相同。
我有一个 C 程序,它使用数组进行队列操作。在那个程序中,他们增加了数组中的一个变量。我不明白这是怎么回事。那么,请解释一下这些操作:
array[++i];
array[i++];
Please explain these operations.
处为您提供元素array[++i];
- 首先递增i
,然后在递增索引相当于:
++i; // or i++ array[i];
array[i++];
- 也首先递增i
,但后缀operator++
returnsi
的值在递增之前相当于:
array[i]; ++i; // or i++
They increment a variable inside array.
不,他们没有。您可以说它们在对数组下标运算符的调用中递增 i
。
数组[++i]; - 递增 i 的值,然后使用递增的值作为数组
的索引数组[i++]; -索引到数组中,然后递增 i
的值++i
递增 i
在 评估它之前。
i++
在 评估后 i
进行了改进。
如果 i=1
则 array[++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++
和 ++i
将 i
加 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;
与上述警告相同。