【发布时间】:2019-07-22 00:47:39
【问题描述】:
我正在准备考试,我收到的一个样题如下:
“以下哪个表达式分配给 new_val(该表达式将替换 HERE)将打印 7?”选择所有适用的:
float m = 7.0
int *a = (int *) &m;
int new_val = HERE;
printf("%d\n", new_val);
(a) *(int *) &m
(b) *a
(c) (int) m
(d) 以上都不是。
答案只是(c)。
我已经在我自己的机器上运行了这个程序,我发现的结果与答案一致。但是,我想知道有人怎么能得到这个答案?更一般地说,我无法理解有关投射指针的规则。我在 StackOverflow 上阅读了其他几篇文章,这些文章对我没有太大帮助。
我想知道是否有人可以帮助澄清我如何解决与此类似的问题。
【问题讨论】:
-
(c) (或更简单的答案 (c')
m)是将浮点值转换(或强制转换)为整数的正确方法。意识到这是一个转换:float值 7.0 的内部表示与int值 7 的内部表示不同。 -
答案 (a) 和 (b),另一方面,试图重新解释
float值 7.0 的内部表示,就好像它是int,没有 i> 进行任何浮点到整数的转换。由于 7.0 的float表示通常是位模式0x40e00000,因此答案 (a) 和 (b) 可能会给您类似 1088421888 的信息。 -
OP 提示:尽管您忠实地复制了考试中的问题并将其提交到 Stack Overflow,但该问题存在缺陷。考试的作者没有完全理解C标准,也没有正确答案。 (My answer 解释了原因。)由于这个缺陷,这个问题没有用,应该被否决。