解除引用后* 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,如果副作用的评估顺序无关紧要)。