解除引用后* p ++会增加吗?
我不确定这里的订单是什么。 是:1)在增加指针p之后取消引用它的值2)在增加它之前取消引用指针p的值
增量和解除引用之间没有排序。 但是, *
运算符适用于p++
的结果,它是增量之前的p
的原始值。
在运算符表中 ,您可以看到后缀运算符++
比*
一元运算符具有更高的位置。
因此, *p++
增加p
(而不是*p
),并且如果p
在增量之前包含的地址返回值(因为它是suffix ++
)。
但顺序是依赖于实现的。 它可以从取消引用p开始,然后增加它,它可以存储p
的旧值,增加它,然后取消引用旧值。
试试吧。 该程序
#include int main(void) { int p[2]; int *q = p; p[0] = 10; p[1] = 100; printf("%d\n", *q++); printf("%d\n", *q); return 0; }
版画
10 100
显示++
适用于p
,而不适用于*p
,并且在取消引用后发生增量。
编辑 :(感谢@EricLippert说服我退出K&R)
不仅可能存在发生后的关系,而且根据K&R第203页,必须有:
后缀表达式后跟++或 – 运算符是后缀表达式。 表达式的表达式的值是操作数的值。 注意到该值后,操作数将递增(++)或递减( – )1。
(强调我的)
当然,我不相信K&R在存在multithreading的情况下会说出C的语义(根据维基百科的pthreads规范于1995年发布),但对于单线程程序,K&R非常清楚。
给定q = *p++;
,q获取p在增量之前指向的值。 另一种说法是表达式*p++
的值是p在递增之前指向的值。
后缀++和 – 运算符本质上比前缀一元运算符具有更高的优先级。 因此,* p ++相当于*(p ++); 它递增p,并返回在p递增之前p指向的值。
要增加p指向的值,请使用(* p)++(或者可能是++ * p,如果副作用的评估顺序无关紧要)。