[英]Precedence of the arrow operator and post increment?
C 的新功能。 所以我看到了这行代码
system->word[system->index++] = system->next_char;
是否等同于:
system->word[system->index] = system->next_char;
index++;
职位增量的优先级是什么? 在线上的所有操作都执行完成后,它是否只将索引的值增加 1?
更新system->index
被定义为未排序(未指定在语句中的其他操作之前或之后)的副作用。 更新可能发生在其他操作之前、期间或之后。
只要它没有在语句的其他地方使用,它没有排序的事实就无关紧要,因为如果它没有在其他地方使用,那么语句所做的任何事情都不会受到更新发生时的影响。 (注意,即使 memory 中的system->index
的更新在使用该值之前完成,编译器也会响应确保使用更新前的值。)
如果正在更新的 object 在语句的其他地方以无顺序的方式使用(即,没有规则指定先更新还是其他使用),则程序的行为将不会由 C 标准定义。
这不是优先级的结果。 优先级决定了如何解释表达式的结构,而不是它们操作的顺序。
不是。
system->word[system->index++] = system->next_char;
相当于:
system->word[system->index] = system->next_char;
system->index++;
因为index
是system
指向的struct
上的一个字段。 如果您还有一个名为index
的标量变量,则您没有错误,但应该增加错误的变量。
作为一般规则,所有一元运算符首先在变量的右侧进行计算,然后是左侧的运算符(右侧运算符的优先级高于左侧运算符)并从最接近操作数到最远进行计算。 所以最靠近操作数的运算符首先计算,然后是右边的下一个......所以直到右边没有更多的右运算符,然后是左边最近的运算符,依此类推,直到没有更多的左运算符在左边。
那么如果我们有-x++
会发生什么? ++
首先被评估为x
的值,并且计划发生变量的后递增,然后评估左侧的值,作为结果给出x
在递增之前的值,改变符号,以及变量x
使其值递增(仅递增,无符号更改)。
另一个例子:让我们计算++x->field
:首先->field
(整个东西, ->
箭头和字段名称)被认为是右一元运算符,给定一个指针获取名为field
fo 的字段中的值x
指向的结构。 该值递增(并再次存储在x->field
)并且返回的值是最终递增的值。
最后一个例子:让我们计算*p++
。 p
的值计划后递增,但保留其先前的值。 然后p
的旧值被用来访问它所指向的值,给原来指向的值。 最后p
递增并指向访问值旁边的值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.