Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 是*p++;解引用后的增量?_C_Operators - Fatal编程技术网

C 是*p++;解引用后的增量?

C 是*p++;解引用后的增量?,c,operators,C,Operators,我不太确定这里的订单是什么。它是: 1) 增加指针p的值后取消对其的引用 2) 在增加指针p的值之前取消对其的引用给定q=*p++,q获取p在增量之前指向的值。另一种说法是,表达式*p++的值是p在递增之前指向的值。后缀++和--运算符的优先级基本上高于前缀一元运算符。因此,*p++相当于*(p++);它递增p,并返回p递增之前指向的值 若要增加p所指的值,请使用(*p)+++(或者如果副作用的评估顺序无关紧要,可以使用++*p)试试。节目 #include <stdio.h> i

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

给定
q=*p++,q获取p在增量之前指向的值。另一种说法是,表达式
*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;
}
显示
++
适用于
p
,而不是
*p
,并且增量发生在取消引用之后

编辑:(感谢@EricLippert说服我退出K&R)

根据K&R第203页的规定,不仅可能存在“发生在”关系,还必须存在:

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

(强调矿山)

诚然,我不相信K&R在多线程(根据1995年发布的pthreads规范)的情况下对C的语义有任何说明,但是对于单线程程序,K&R是非常清楚的,您可以看到后缀运算符
++
的位置高于
*
一元运算符

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


但顺序取决于具体实施。它可以从解引用p开始,然后增加它,它可以存储
p的旧值,增加它,然后取消引用旧值。

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

它可以找到
*p
,增量
p
,并分配
*p
的值(首先计算的值)对于
q
@asaelr来说,赋值实际上可能发生在增量之后,这是一个公平的观点,但效果是相同的:q在p增加之前获得*p的值。效果是相同的,但问题是先发生什么。问题与赋值无关——OP是问是增量还是取消引用先发生。在任何情况下,重写答案以考虑您的担忧。好吧,尊重也可能在增量之后。请在这里稍等片刻。在C语言中,肯定会有一种“发生在”之后的关系;是否有编译器的实现细节。C编译器在选择如何在一个序列点内排序副作用方面拥有广泛的自由裁量权,如果它愿意,它可以选择在做其他事情之后再做A++的副作用。C#编译器没有相同的格度;C#规范非常清楚何时必须观察到这种副作用。(在一个执行线程内观察到;另一个线程观察到副作用的顺序未指定。)“后增量和后减量运算符将其操作数的值增加(或减少)1,但表达式的值是在增量(或减量)操作之前操作数的原始值”
10
100