【发布时间】:2015-11-05 18:44:40
【问题描述】:
一位朋友向我展示了他在课堂上必须做的多项选择题,他知道正确答案是什么,但他并不真正理解给定代码中为什么或发生了什么。
在这里(假设我输入的没有任何错误):
What does the following code display ?
typedef union{
long adr;
struct{
unsigned char a,b,c,d,e;
}x;
}Ip;
static Ip y;
printf("%l2ld | %02X.%02X.%02X.%02X.%02X\n",
y.adr,y.x.a,y.x.b,y.x.c,y.x.d,y.x.e);
y.adr=1234567890;
printf("%l2ld | %02X.%02X.%02X.%02X.%02X\n",
y.adr,y.x.a,y.x.b,y.x.c,y.x.d,y.x.e);
y.x.a='A';y.x.b='B';y.x.c='C';y.x.d='D';y.x.e='E';
printf("%l2ld | %02X.%02X.%02X.%02X.%02X\n",
y.adr,y.x.a,y.x.b,y.x.c,y.x.d,y.x.e);
Answers (?? means a random value) :
A)
0 | 00.00.00.00.00
1234567890 | 00.00.00.00.00
1234567890 | 41.42.43.44.45
B)
0 | 00.00.00.00.00
1234567890 | ??.??.??.??.??
?????????? | 41.42.43.44.45
C)
?????????? | ??.??.??.??.??
1234567890 | ??.??.??.??.??
1234567890 | 41.42.43.44.45
D) Something else
现在,他得到了正确的答案,即 B,但他不明白为什么,并说他希望 C 是正确的答案。不幸的是,我也不确定这里会发生什么。有人能给我们详细介绍一下这段代码的作用并帮助我们理解答案吗?提前致谢!
【问题讨论】:
-
所以“你的朋友”应该问问自己。
-
这会调用未定义的行为。
-
为什么
your friend期望答案是C? -
以上都不是。
?值不是随机的。它们取决于机器的字节序,以及long中的字节数。如果格式说明符中没有拼写错误,您会更好。 -
我明白了,但这个问题非常具有误导性。如果
y声明为静态范围,那么它是零初始化的。