我不确定这里的订单是什么。是吗: 1)增加指针p后的值取消引用 2)在增加之前取消引用指针p的值
答案 0 :(得分:33)
增量和解除引用之间没有排序。但是,*
运算符适用于p++
的结果,这是增量前p
的原始值。
答案 1 :(得分:13)
在operators table中,您可以看到后缀运算符++
的位置高于*
一元运算符。
因此,*p++
增加p
(而不是*p
),并返回p
在增量之前包含的地址的值(因为它是{{1} }})。
但顺序是依赖于实现的。它可以从取消引用p开始,然后增加它,它可以存储旧值suffix ++
,增加它,然后取消引用旧值。
答案 2 :(得分:4)
试试吧。该计划
#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&amp; R)
不仅可能存在后发生关系,而且根据K&amp; R第203页,必须有:
后缀表达式后跟++或 - 运算符是后缀表达式。表达式的表达式的值是操作数的值。 注意到值后,操作数递增(++)或递减( - )1。
(强调我的)
当然,我不相信K&amp; R表示存在多线程时C语义的任何内容(根据Wikipedia pthreads规范于1995年发布),但对于单线程程序K&amp; R很清楚。
答案 3 :(得分:3)
给定q = *p++;
,q得到p在增量之前指向的值。另一种说法是表达式*p++
的值是p在递增之前指向的值。
答案 4 :(得分:3)
后缀++
和--
运算符的优先级高于前缀一元运算符。因此,*p++
相当于*(p++)
;它递增p
,并返回p
在p
递增之前指向的值。
要增加p
指向的值,请使用(*p)++
(或者++*p
,如果副作用的评估顺序无关紧要。)