在L值中使用后缀增量

时间:2010-10-20 13:57:05

标签: c

  

可能重复:
  In what order does evaluation of post-increment operator happen?

考虑以下代码段(在C中):


uint8_t index = 10;
uint8_t arr[20];

arr[index++] = index;

当我使用gcc编译它时,它将arr [10]设置为10,这意味着直到整个赋值表达式之后才应用后缀增量。我发现这有点令人惊讶,因为我期望增量返回原始值(10)然后增加到11,从而将arr [10]设置为11。

我在RValues中看过很多关于增量运算符的帖子,但在LValue表达式中没有。

感谢。

3 个答案:

答案 0 :(得分:4)

一些standard语言:

6.5表达式

1表达式是一系列运算符和操作数,用于指定a的计算 值,或指定对象或功能,或产生副作用,或 执行它们的组合。

2在前一个和下一个序列点之间,一个对象应具有其存储值 通过表达式的评估最多修改一次。 72)此外,先前的值应该是只读的,以确定要存储的值。 73)

3运算符和操作数的分组由语法表示。 74)除非后面指定(对于函数调用()&amp;&amp; < / b>, || ?:和逗号运算符),子表达式的评估顺序和副作用发生的顺序都是未指定的。

第2段显式呈现a[i++] = i形式的表达式未定义; i的先前值不只是被读取以确定i++的结果。因此,允许任何结果。

除此之外,在评估表达式后,您不能立即依赖++运算符的副作用。对于像

这样的表达式
a[i++] = j++ * ++k

唯一保证表达式j++ * ++k结果已分配给表达式a[i++]结果;但是,每个子表达式a[i++]j++++k都可以按任意顺序进行评估,以及副作用(分配给a[i] ,可以按任何顺序应用,更新i,更新j和更新k)。

答案 1 :(得分:1)

该行

arr[index++] = index;

导致未定义的行为。阅读C标准了解更多详情。

你应该知道的本质是:你不应该在同一个语句中阅读和更改变量。

答案 2 :(得分:1)

作业操作从右到左进行,即首先计算表达式的右侧部分,然后将其分配到左侧部分。