箭头运算符和 post 增量的优先级?

Precedence of the arrow operator and post increment?

初学C,所以看到了这行代码

system->word[system->index++] = system->next_char;

是否等同于:

system->word[system->index] = system->next_char;
index++;

post增量的优先级是什么?是否仅在行上的所有操作执行完毕后才将索引的值增加 1?

更新 system->index 被定义为 副作用 未按顺序(未指定在语句中的其他操作之前或之后)。更新可能发生在其他操作之前、期间或之后。

只要它没有在语句的其他地方使用,它没有被排序的事实是无关紧要的,因为如果它没有在其他地方使用,那么当更新发生时,语句所做的任何事情都不会受到影响。 (请注意,即使在使用该值之前完成对内存中 system->index 的更新,编译器也会响应以确保使用更新前的值。)

如果正在更新的对象以无序的方式在语句的其他地方使用(也就是说,没有规则指定哪个先出现,更新还是其他使用),那么程序的行为将不会被定义C 标准。

这不是优先顺序的结果。优先级决定了表达式如何解释的结构,而不是它们操作的顺序。

没有。

system->word[system->index++] = system->next_char;

相当于:

system->word[system->index] = system->next_char;
system->index++;

因为 indexsystem 指向的 struct 上的字段。如果您还有一个名为 index 的标量变量,您没有错误,但应该增加错误的变量。

作为一般规则,所有 一元运算符 首先在变量的右侧求值,然后在左侧(右侧运算符的优先级高于左侧)旁边的)并从最接近操作数到最远进行评估。所以最靠近操作数的运算符首先求值,然后是右边的下一个...所以直到右边没有更多的 right operators ,然后是最接近的在左边,依此类推,直到左侧不再有 left 运算符

那么如果我们有 -x++ 会发生什么? ++ 首先被评估为 x 的值,并且变量的 post 增量是计划发生的,然后评估左边的那个,作为结果给出 x before 递增,符号改变,变量 x 的值递增(仅递增,符号不变)。

另一个例子:让我们计算 ++x->field:首先 ->field(整个东西,-> 箭头和字段名称)被认为是右一元运算符,给定指针获取 x 指向的名为 field 结构的字段中的值。该值递增(并再次存储在 x->field 中),返回值是最后递增的值。

另一个最后的例子:让我们计算*p++p 的值计划增加 post,但会保留其先前的值。然后用p的旧值访问它指向的值,给原来指向的值。最后 p 递增并指向访问值旁边的值。