箭头运算符和 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++;
因为 index
是 system
指向的 struct
上的字段。如果您还有一个名为 index
的标量变量,您没有错误,但应该增加错误的变量。
作为一般规则,所有 一元运算符 首先在变量的右侧求值,然后在左侧(右侧运算符的优先级高于左侧)旁边的)并从最接近操作数到最远进行评估。所以最靠近操作数的运算符首先求值,然后是右边的下一个...所以直到右边没有更多的 right operators ,然后是最接近的在左边,依此类推,直到左侧不再有 left 运算符。
那么如果我们有 -x++
会发生什么? ++
首先被评估为 x
的值,并且变量的 post 增量是计划发生的,然后评估左边的那个,作为结果给出 x
before 递增,符号改变,变量 x
的值递增(仅递增,符号不变)。
另一个例子:让我们计算 ++x->field
:首先 ->field
(整个东西,->
箭头和字段名称)被认为是右一元运算符,给定指针获取 x
指向的名为 field
结构的字段中的值。该值递增(并再次存储在 x->field
中),返回值是最后递增的值。
另一个最后的例子:让我们计算*p++
。 p
的值计划增加 post,但会保留其先前的值。然后用p
的旧值访问它指向的值,给原来指向的值。最后 p
递增并指向访问值旁边的值。
初学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++;
因为 index
是 system
指向的 struct
上的字段。如果您还有一个名为 index
的标量变量,您没有错误,但应该增加错误的变量。
作为一般规则,所有 一元运算符 首先在变量的右侧求值,然后在左侧(右侧运算符的优先级高于左侧)旁边的)并从最接近操作数到最远进行评估。所以最靠近操作数的运算符首先求值,然后是右边的下一个...所以直到右边没有更多的 right operators ,然后是最接近的在左边,依此类推,直到左侧不再有 left 运算符。
那么如果我们有 -x++
会发生什么? ++
首先被评估为 x
的值,并且变量的 post 增量是计划发生的,然后评估左边的那个,作为结果给出 x
before 递增,符号改变,变量 x
的值递增(仅递增,符号不变)。
另一个例子:让我们计算 ++x->field
:首先 ->field
(整个东西,->
箭头和字段名称)被认为是右一元运算符,给定指针获取 x
指向的名为 field
结构的字段中的值。该值递增(并再次存储在 x->field
中),返回值是最后递增的值。
另一个最后的例子:让我们计算*p++
。 p
的值计划增加 post,但会保留其先前的值。然后用p
的旧值访问它指向的值,给原来指向的值。最后 p
递增并指向访问值旁边的值。