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

时间:2021-01-31 15:47:12

标签: c operator-precedence

刚接触 C。所以我看到了这行代码

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

是否等价于:

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

后增量的优先级是什么?是否只在该行上的所有操作执行完后才将 index 的值加 1?

2 个答案:

答案 0 :(得分:1)

更新 system->index 被定义为一种副作用,它没有对语句中的其他操作进行排序(未指定在其之前或之后)。更新可能发生在其他操作之前、期间或之后。

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

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

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

答案 1 :(得分:1)

不是。

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

相当于:

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

as indexstruct 指向的 system 上的一个字段。如果您还有一个名为 index 的标量变量,您没有错误,但错误的变量应该已经增加了。

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

那么如果我们有 -x++ 会发生什么? ++ 首先评估为 x 的值,并且计划发生变量的后增量,然后评估左侧的,结果给出 x 的值之前递增,符号改变,变量x的值递增(只递增,符号不变)。

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

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