解除引用后* p ++会增加吗?

时间:2012-02-13 03:18:38

标签: c operators

我不确定这里的订单是什么。是吗: 1)增加指针p后的值取消引用 2)在增加之前取消引用指针p的值

5 个答案:

答案 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,并返回pp递增之前指向的值。

要增加p指向的值,请使用(*p)++(或者++*p,如果副作用的评估顺序无关紧要。)