我不太确定这里的顺序是什么。是: 1)在增加指针p的值后取消引用它 2)在取消引用指针p的值之前增加它
在递增和解引用操作之间没有顺序关系。但是,*
运算符应用于 p++
的结果,即递增之前 p
的原始值。
在运算符表格中,你可以看到后缀运算符++
比一元运算符*
的优先级高。
因此,*p++
会增加p
(而不是*p
),并返回p
在递增之前包含的地址的值(因为它是后缀 ++
)。
但是这个顺序与实现相关。它可能首先解引用p
,然后递增它,也可能存储p
的旧值,递增它,然后解引用旧值。
试一下。这个程序
#include <stdio.h>
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)不仅可能存在happens-after关系,而且根据K&R第203页的说法,必须存在:(强调我的)。当然,我不认为K&R在存在多线程的情况下对C的语义有任何说明(根据维基百科,pthreads规范是在1995年发布的),但对于单线程程序,K&R非常清楚。后缀表达式后跟++或--运算符是后缀表达式。 表达式的值是操作数的值。 在注意到值之后,将增加(++)或减少(--)操作数1。
给定 q = *p++;
,q 会得到指针 p 自增之前所指向的值。另一种说法是,表达式 *p++
的值是指针 p 自增之前所指向的值。
*p
,增加 p
并将先计算出的 *p
的值赋给 q
。 - asaelr++
和--
的优先级高于前缀一元运算符。因此,*p++
等同于*(p++)
;它会递增p
,并返回p
在递增之前所指向的值。p
所指向的值,请使用(*p)++
(如果副作用的评估顺序不重要,则可以使用++*p
)。