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

Tem*_*muz 22 c operators

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

R..*_*R.. 36

增量和解除引用之间没有排序.但是,*运算符应用于结果p++,即p增量之前的原始值.

  • “后递增和后递减运算符将其操作数的值增加(或减少)1,但表达式的值是操作数在递增(或递减)操作之前的原始值”https://en。 wikipedia.org/wiki/Increment_and_decrement_operators (2认同)

asa*_*elr 14

运算符表中,您可以看到后缀运算符++*一元运算符具有更高的位置.

因此,*p++增加p(而不是*p),并返回p增量之前包含的地址的值(因为它是suffix ++).

但顺序是依赖于实现的.它可以从取消引用p开始,然后增加它,它可以存储旧值p,增加它,然后取消引用旧值.


Ada*_*cin 5

Try it. The program

#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;
}
Run Code Online (Sandbox Code Playgroud)

prints

10
100
Run Code Online (Sandbox Code Playgroud)

showing that the ++ applies to p, not to *p, and that the increment happens after the dereference.

EDIT: (Thanks to @EricLippert for convincing me to pull out K & R)

Not only may there be a happens-after relationship, but according to K & R page 203, there must be:

后缀表达式后跟 ++ 或 -- 运算符是后缀表达式。表达式的表达式的值就是操作数的值。 记下该值后,操作数将递增 (++) 或递减 (--) 1。

(强调我的)

诚然,我不相信 K & R 在存在多线程的情况下对 C 的语义有任何说明(根据Wikipedia,pthreads 规范于 1995 年发布),但对于单线程程序,K & R 非常清楚。

  • 在这里稍等一下。在 **C** 中肯定存在“发生在之后”的关系;是否有编译器的实现细节。AC 编译器在选择如何对序列点内的副作用进行排序方面拥有广泛的自由裁量权,并且如果愿意,它可以选择在其他一切之后执行 ++ 的副作用。AC# 编译器没有相同的纬度;C# 规范非常清楚何时必须观察到这种副作用。(在一个执行线程内观察到;另一个线程观察副作用的顺序是未指定的。) (4认同)