我不明白为什么我得到以下代码的输出1,2,3。我认为它应该是1,2,2。第一次输出的原因是什么?
另外,请允许我指出,还有其他与此类指针算法和解除引用有关的问题,但这些问题的答案表明输出应为1,2,2。
int main()
{
int p[3] = {1,2,3};
int *q = p;
printf("%d\n", *q);
printf("%d\n", *++q);
int x = ++*q;
printf("%d\n", *q);
}
答案 0 :(得分:5)
int p[3] = {1,2,3};
int *q = p;
printf("%d\n", *q);
q
指向1.元素,上面打印1
printf("%d\n", *++q);
q
指向2.元素,上面打印2。
int x = ++*q;
2.元素从2增加到3。
printf("%d\n", *q);
q
指向2.元素,上面打印3。
答案 1 :(得分:1)
*++q
被解析为*(++q)
; ++q
(q + 1
)的结果被解除引用,并且副作用q
递增,
++*q
被解析为++(*q)
; *q
(2
)的结果是++
的操作数,产生3
。作为副作用,*q
会增加。
请记住,后缀和前缀++
都有结果和副作用'并且在评估表达式后不必立即应用副作用。 IOW,
a = b++ * ++c;
将被评估为
a = b * (c + 1);
但b
和c
不必更新,直到下一个序列点。
答案 2 :(得分:-1)
Hi,
int p[3] = {1,2,3};
int *q = p;
printf("%d\n", *q); // The output for this line is 1
printf("%d\n", *++q); // Pre Incrementing the 1 which becomes 2
int x = ++*q;
// Here we are making the x point to same location as q and then we are
incrementing the location of the address q. Like q is pointing to the next location and so is the x.Hence the *q gives us 3 which is the value of the incremented location.
printf("%d\n", *q);
Hope it is helpful