考虑:
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
有人可以解释一下吗?
考虑:
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
有人可以解释一下吗?
关键是+=
and++
运算符的优先级。的++
优先级高于+=
(事实上,赋值运算符在 C 中的优先级倒数第二),所以运算
*p++
意味着取消引用指针,然后将指针本身增加 1(通常,根据指针算术规则,它不一定是一个字节,而是sizeof(*p)
关于结果地址)。另一方面,
*p += 1
意味着将指针指向的值加一(并且对指针本身不做任何事情)。
优先权。后缀++
比前缀绑定得更紧密,*
所以它递增p
。与普通赋值运算符一起位于优先级列表的+=
低端,因此它将 1 添加到*p
.
前缀 ++ 和 * 的优先级相同。两者的关联性是从右到左。后缀 ++ 的优先级高于 * 和前缀 ++。后缀 ++ 的结合性是从左到右的。
让我们从*p += 1
我会尝试从一个不同的角度来回答这个问题... 第 1 步让我们看看运算符和操作数:在这种情况下,它是一个操作数(指针 p),我们有两个运算符,在这种情况下 *用于取消引用,+= 1 用于增量。具有更高优先级的第 2 步 * 优先于 +=
*P++
这个有点棘手......甚至可能是邪恶的 我们有一个操作数(p 指针)和两个运算符,只是现在用于取消引用的 * 和 ++ 后增量具有相同的优先级。(在某些表格中,帖子中的 ++ 具有更高的优先级。)
第 1 步让我们看一下运算符和操作数:在这种情况下,它是操作数,并且您有两个运算符,在这种情况下,* 表示取消引用,++ 表示递增。第 2 步哪个优先级更高?++ 的优先级高于 * 注意:即使它们具有相同的优先级,它们也会从右到左关联,同样,++ 在 * 步骤 3 之前(棘手的部分......) ++ 在哪里?它在操作数的右侧,这意味着POST Increment在这种情况下,编译器会记下“心理笔记”以在AFTER 之后执行增量它与所有其他操作员一起完成......之后是什么意思?这意味着它只会将增量应用为下一个“;”之前的最后一步。所以它将与同一“行”上的所有其他运算符一起完成注意:如果它是 *++p 那么它将在同一行上的任何其他运算符之前执行它所以在这种情况下,它等同于采取处理器的两个寄存器,一个将保存取消引用的 *p 的值,另一个将保存递增的 p++ 的值,在这种情况下有两个原因是 POST 活动......这是在这种情况下这很棘手,而且看起来很矛盾。人们会期望 ++ 优先于 *,它确实如此,只是 POST 意味着它将仅在所有其他操作数之后应用,在下一个 ';' 之前 令牌...
就像我说的,棘手的部分是操作数右侧的任何增量都将被搁置一旁,并在移至下一行之前作为 LAST 操作应用......