为什么* p ++与* p + = 1不同?

时间:2012-08-31 19:22:53

标签: c

考虑:

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

char *s = "abcd";
char *a = s; 
foo1(&a); 
printf("%s", a); //abcd

但如果我使用foo2()代替:

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

有人可以解释一下吗?

4 个答案:

答案 0 :(得分:95)

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

*p++

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

*p += 1

表示将指针指向的值增加1(并且不对指针本身执行任何操作)。

答案 1 :(得分:29)

优先级。后缀++绑定比前缀*更紧密,因此它会增加p+=与优先级赋值运算符一起位于优先级列表的低端,因此它向*p添加1。

答案 2 :(得分:0)

前缀++和*的优先级相同。两者的相关性是从右到左。 postfix ++的优先级高于*和前缀++。后缀++的相关性从左到右。

答案 3 :(得分:0)

让我们从*p += 1

开始

我将尝试从一个不同的角度回答这个问题......步骤1让我们看一下运算符和操作数:在这种情况下,它是一个操作数(指针p),我们有两个运算符,这种情况*用于解除引用,+ = 1用于增量。具有较高优先级*的步骤2优先于+ =

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

步骤1让我们看一下运算符和操作数:在这种情况下它是操作数,你有两个运算符,在这种情况下*用于解除引用,++用于增量。第2步具有更高的优先级? ++具有更高的优先级*注意:即使它们具有相同的优先权,它们也从右向左关联,再次,++之前是* 第3步(棘手的部分......)++在哪里?它位于操作数的右侧,这意味着 POST增量在这种情况下,编译器采用“心理记录”来执行增量 AFTER 它完成所有操作其他运营商...... 什么意思?这意味着它只会在下一个';'之前的最后一步中应用增量。所以它将与同一'线'上的所有其他运营商完成 注意:如果它是* ++ p那么它将在同一行上的任何其他运算符之前执行它,所以在这种情况下,它等同于取两个处理器的寄存器,一个将保存解除引用的* p的值另一个将保存递增的p ++的值,在这种情况下有两个原因,就是POST活动......这是在这种情况下它是棘手的,它看起来像一个矛盾。人们会期望++优先于*,它只会使POST意味着它将仅在所有其他操作数之后应用,在下一个';'之前令牌...

就像我说的那样,棘手的部分是操作数右侧的任何增量都将被搁置,并且在它移动到下一行之前将作为LAST操作应用...