恐怕我没有正确理解运营商之间的优先顺序。以下程序的工作方式与预期不同:
#include<stdio.h>
int main(){
char a[] = "abc";
char *p;
int i;
p = a;
for(i = 0; i < 3; ++i) /* First case */
printf("%c\n", *p++);
printf("a = %s\n", a);
p = a;
for(i = 0; i < 3; ++i) /* Second case */
printf("%c\n", (*p)++);
printf("a = %s\n", a);
return 0;
}
第一种情况:根据此table,*p++
为*(p++)
。我递增p
指向的地址,然后我取消引用它。为什么它会返回abc
,而不是bc + "value beyond string"
?
第二种情况遇到类似的问题,表达式为(*p)++
。在这种情况下,括号使我增加p的 dereferentiated 值。因此,我希望表达式返回bcd
而不是dbc
。
答案 0 :(得分:1)
在第一种情况下,它在之后执行指针增量,返回它的值,因为该操作是 post -increment。
在第二种情况下,您在循环中递增*p
次3次而不更改p
本身的值。因此a
的第一个元素(p
指向的)会增加3倍,从而导致'a'+3='d'
。其余元素保持不变。
答案 1 :(得分:1)
第一种情况:
迭代1:i = 0,* p = a,指向'abc'。 现在在这个陈述之后p将指向'b'并且i = 1
迭代2:i = 1,* p = b,指向'abc'。 现在在这个陈述之后p将指向'c'和i = 2
迭代3:I = 2,* p = c,指向'abc'。 现在在这个语句之后,p将指向null终止char和i = 3
迭代4:循环中断,仍然指向'abc'
第二种情况:
迭代1:i = 0,* p ='a',a指向'abc'。 在该陈述之后,p点的值增加,因此指向'bbc'并且i = 1
迭代2:i = 1,* p ='b',指向'bbc'。 在该陈述之后,p点的值增加,因此指向'cbc'和i = 2
迭代3:i = 2,* p ='c',指向'cbc'。 在此语句之后,p点的值增加,因此指向'dbc'和i = 3
迭代4:循环中断并指向'dbc' 并且p指向'd'