考虑:
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
有人可以解释一下吗?
答案 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操作应用...