可能重复:
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表达式中没有。
感谢。
答案 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)
作业操作从右到左进行,即首先计算表达式的右侧部分,然后将其分配到左侧部分。