如果我在主要内容中有以下内容......
int i;
int *p;
i = 0;
p = &i;
printf("%x\n", *p);
for (int j = 0; j < 20; j++) {
printf("%x ", *p++);
}
puts("\n\n");
p = &i;
for (int j = 0; j < 20; j++) {
printf("%x ", ++*p);
}
......我的输出很奇怪......
0 569d8a48 7fff 1 0 569d8a38 7fff 9227ce4 1 0 0 0 0 1 0 569d8b98 7fff 0 0 569d8be9
1 2 3 4 5 6 7 8 9 a b c d e f 10 11 12 13 14
请注意,i
只是一个整数 - 我想看看如果我查看其他内存位置会发生什么。但后期/增加前的差异让我感到意外。
是否有人知道可能导致此类事件的原因(即第二行如何以完美递增的顺序)?
答案 0 :(得分:7)
在C中,后缀运算符的优先级高于前缀运算符。因此*p++
被解释为好像是*(p++)
。也就是说,你正在递增指针。然后,您将取消引用以打印恰好存储在内存中该位置的整数。
但是++*p
被解释为++(*p)
,所以你正在递增指针所指向的值(即整数i
)。这也是++运算符的返回值,所以这就是你看到的。
答案 1 :(得分:4)
++
和一元*
运算符的优先级相同。关联性是从右到左。
因此,在第一个示例中,*p++
等同于*(p++)
(这是未定义的行为)。在第二个示例中,++*p
相当于++(*p)
。