C 为什么*p++;不同于*p+;=1.

C 为什么*p++;不同于*p+;=1.,c,C,考虑: void foo1(char **p) { *p++; } void foo2(char **p) { *p += 1; } 及 但是如果我使用foo2()而不是: char *a = s; foo2(&a); printf("%s", a); //bcd 有人能解释一下吗?关键是+=和+运算符的优先级。++的优先级高于+=(事实上,赋值运算符在C中的优先级是第二低的),因此 *p++ 表示取消对指针的引用,然后将指针本身增加1(通常,根据指针算术规则,它不一定是一个字

考虑:

void foo1(char **p) { *p++; }
void foo2(char **p) { *p += 1; }

但是如果我使用
foo2()
而不是:

char *a = s; 
foo2(&a); 
printf("%s", a); //bcd

有人能解释一下吗?

关键是
+=
+
运算符的优先级。
++
的优先级高于
+=
(事实上,赋值运算符在C中的优先级是第二低的),因此

*p++
表示取消对指针的引用,然后将指针本身增加1(通常,根据指针算术规则,它不一定是一个字节,而是关于结果地址的
sizeof(*p)
)。另一方面,

*p += 1

表示将指针指向的值增加一(并且不处理指针本身)。

优先级。后缀
++
比前缀
*
绑定得更紧,因此它会增加
p
+=
与普通赋值运算符一起位于优先级列表的低端,因此它将前缀+/*的优先级增加1,并且*相同。两者的关联性是从右向左的。后缀++的优先级高于*和前缀++。postfix++的关联性是从左到右的。

让我们从
*p+=1开始。

我将试着从一个不同的角度来回答这个问题。。。步骤1让我们看一下运算符和操作数:在本例中,它是一个操作数(指针p),我们有两个运算符,在本例中,*表示去引用,+=1表示增量。具有较高优先级*的步骤2的优先级高于+=


*p++
这个有点棘手。。。甚至可能是邪恶的 同样,我们有一个操作数(指针p)和两个运算符,只是现在用于取消引用的*和++后增量具有相同的优先级。(在某些表中,post中的++具有更高的优先级。)

步骤1让我们看一下运算符和操作数:在本例中,它是操作数,您有两个运算符,在本例中,*用于解引用,++用于增量。步骤2哪个优先级更高?++具有比*更高的优先级注意:即使它们具有从右到左关联的相同优先级,++也比*高* 步骤3(棘手的部分…)哪里是++?它位于操作数的右侧,这意味着增量后在这种情况下,编译器在使用所有其他运算符完成增量后执行。。。 什么意思?这意味着它将只在下一个“;”之前的最后一步应用增量因此,它将与同一“线路”上的所有其他运营商一起完成 注意:如果它是*++p,那么它将在同一行上的任何其他运算符之前执行,因此在这种情况下,它相当于取处理器寄存器的两个,一个将保存被取消引用的*p的值,另一个将保存递增的p++的值,在这种情况下有两个原因,即后期活动。。。在这种情况下,这是一个棘手的问题,看起来很矛盾。人们会期望++优先于*,它确实是这样做的,只是POST意味着它只能在所有其他操作数之后、下一个“;”之前应用代币


正如我所说,棘手的部分是,操作数右边的任何增量都将被搁置,并将作为下一行之前的最后一个操作应用…

,因为
*p++
*(p++)
相同,也请尝试
void foo3(char**p){p++;}
享受你漂亮的问题徽章:-)你解释得很好,但是你能添加一个细节吗*p++将指针本身增加1个“单位”,因此char指针可能增加1个,而int指针可能增加4个,等等,这取决于具体的实现。@EdwinBuck:我真的看不出相关性,这只是普通的指针算法,不是问题的焦点。@EdwinBuck无论指针是int还是char,当你增加它时,它都会增加1。由于指针的大小,表示该指针的实际地址可能会更改多个字节。@RichardJ.RossIII我们都是对的,但我们谈论的是不同的1。一个单位,或
sizeof(*p)
在某种程度上仍然是1,但是如果你看看
p
中存储的二进制值,在二进制算术中实际值并不总是“+1”。指针的表示形式,在许多C实现中是简单的内存地址,不应该与其值混淆,这就是它在C上下文中的含义<代码>p++会将值增加一。就本问题而言,其对该值表示的影响与此无关,与向浮点
1.f
中添加1通常会将表示更改8388608相同。
*p += 1