问题描述
刚接触 C。所以我看到了这行代码
system->word[system->index++] = system->next_char;
是否等价于:
system->word[system->index] = system->next_char;
index++;
后增量的优先级是什么?是否只在该行上的所有操作执行完后才将 index 的值加 1?
解决方法
更新 system->index
被定义为一种副作用,它没有对语句中的其他操作进行排序(未指定在其之前或之后)。更新可能发生在其他操作之前、期间或之后。
只要没有在语句的其他地方使用它,它没有被排序的事实是无关紧要的,因为如果它没有在其他地方使用,那么语句所做的任何事情都不会受到更新发生时的影响。 (注意,即使更新到内存中的 system->index
在使用该值之前完成,编译器也会响应以确保使用更新前的值。)
如果被更新的对象在语句中的其他地方以无序的方式使用(即没有规则指定哪个先出现,更新或其他用途),那么程序的行为将不会由 C 定义标准。
这不是优先级的结果。优先级决定了如何解释表达式的结构,而不是它们的操作顺序。
,不是。
system->word[system->index++] = system->next_char;
相当于:
system->word[system->index] = system->next_char;
system->index++;
as index
是 struct
指向的 system
上的一个字段。如果您还有一个名为 index
的标量变量,您没有错误,但错误的变量应该已经增加了。
作为一般规则,所有一元运算符首先在变量的右侧求值,然后是左侧的(右侧运算符的优先级高于左侧的运算符)并求值从最接近操作数到最远。所以最接近操作数的运算符首先计算,然后是右边的下一个......直到右边没有更多的右边的运算符,然后是左边的最近的,依此类推直到左边没有更多的左操作符。
那么如果我们有 -x++
会发生什么? ++
首先评估为 x
的值,并且计划发生变量的后增量,然后评估左侧的,结果给出 x
的值之前递增,符号改变,变量x
的值递增(只递增,符号不变)。
另一个例子:让我们计算 ++x->field
:首先 ->field
(整个事物,->
箭头和字段名称)被认为是一个右一元运算符,给定一个指针field
指向的结构名为 x
的字段中的值。该值递增(并再次存储在 x->field
中),返回的值为最后递增的值。
最后一个例子:让我们计算 *p++
。 p
的值计划为后递增,但保留其先前的值。然后使用 p
的旧值访问它所指向的值,给出原始指向的值。最后 p
递增并指向访问值旁边的值。