【发布时间】:2015-12-31 12:12:51
【问题描述】:
为什么给定的代码会给出以下输出。
#include <stdio.h>
int main(void)
{
int x = 0x12345678;
unsigned short *p = &x;
unsigned char *q = &x;
printf("%x %x\n",*p++,*p++);
printf("%x %x %x %x\n",q[0],q[1],q[2],q[3]);
return 0;
}
输出:
1234 5678
78 56 34 12
而不是:
1234 5678
12 34 56 78
我认为答案可能是架构的字节序必须导致它。但我无法理解如何,因为整个4-byte 必须以连续的方式存储。
也不要*q++和*(q+1)指向同一个地址?
【问题讨论】:
-
q++具有q的值,但在 返回它的值之后递增。q + 1的值为q + 1,与q不同。 -
@πάντα ῥεῖ 为什么将这个 C 问题标记为 C++ 问题的副本?你知道 C 和 C++ 不是同一种语言吗?
-
更重要的是,链接的问题有一条评论,明确指出不应将其标记为 C,因为 C 对未定义行为有不同的规则。
-
“因为整个 4 字节必须以连续的方式存储”是字节序的定义。
-
@RahulShah 通常,您不能在一个语句中对同一个变量进行两次后增量。这会导致未指定的评估顺序。