int main(void)
{
int n1 = 2, n2 = 5;
int *p = &n1, *q = &n2;
*p = *(q++);
printf("%d,%d", *p, *q);
return 0;
}
输出= 5,5
为什么*q
的值为5,它应该有一些垃圾值?
int main(void)
{
int n1 = 2, n2 = 5;
int *p = &n1, *q = &n2;
*p = *(++q);
printf("%d,%d", *p, *q);
return 0;
}
输出= 2,2
这是怎么回事? 任何人都可以解释优先规则如何在指针中工作?
答案 0 :(得分:6)
*p = *(q++);
(或多或少)等同于*p = *q; q++;
,因此p
很好。将评估q++
,产生q
的旧值(即值预增量)。您所看到的是预期的行为。
q
调用中printf
的尊重中确实存在未定义的行为,因为q
不再指向您此时拥有的内存。一百万个不同的东西可能导致这种情况(例如,上次分配内存,可能是5,编译器太漂亮并试图帮助你等),但你不能也不应该依赖这种行为。这样做很危险,这个程序可能会在许多编译器/操作系统/硬件上崩溃或输出废话。
答案 1 :(得分:1)
为什么* q的值为5,它应该有一些垃圾值?
这是由于*p
中的后缀增量,它在指针取消引用和赋值给*q
之后起作用。
因此,*p
指向的地址的当前值已分配给5,5
,,然后q将递增为&#34;垃圾值&#34; < / em>。
打印sudo service apache2 restart
中的这个奇怪结果是未定义的行为。