【发布时间】:2017-12-21 13:46:30
【问题描述】:
int main()
{
int x = 30, *y, *z;
y = &x;
/* Assume address of x is 500 and integer is 4 byte size */
z = y;
*y++ = *z++;
x++;
printf("x=%d, y=%d, z=%d\n", x, y, z);
return 0;
}
以上是代码。
输出为:x=31, y=504, z=504
如有错误请指正:
据我了解:y=&x; 将x 的地址分配给y。所以,y 现在拥有500 的值。
z=y; 由于y = 500,这会将500 分配给z。
真正让我困惑的是这部分*y++=*z++;,我不完全知道这意味着什么,因为同时发生了很多事情。 z 被递增并指向某个地方(它实际上指向哪里?没有像 y 即 y=&x; 那样分配给它的地址。然后*y 也同时递增(你甚至允许这样做吗? ?)。
让我感到困惑的另一件事是:在我看来,由于y 指向x,当y++ 发生时,x 应该递增到31,然后在向下代码块时x++ 发生,x 现在应该是 32。
那么,问题是,我们如何得到x=31, y=504, z=504 的输出?谢谢你。
【问题讨论】:
-
printf("x=%d, y=%d, z=%d\n", x, y, z);是未定义的行为。如果你必须这样做,请使用%p来打印指针。 -
@Evert 是的,这是为了锻炼。我正在尝试理解输出。
-
@JosefHoppe 来自 UB。
-
@AjayBrahmakshatriya 如
printf("x=%d, y=%p, z=%p\n", x, y, z);?