【发布时间】:2016-01-26 07:14:57
【问题描述】:
在一次采访中,有人问我如何看待以下代码:
#include <stdio.h>
int main()
{
float f = 10.7;
int a;
a = f;
printf ("%d\n", a);
}
我回答:
当您将
float更改为int而不进行强制转换时,编译器会发出警告。int将具有垃圾值,因为您没有使用强制转换。
然后,他们允许我在在线编译器上运行程序。我不知所措。我的两个假设都是错误的。编译器没有发出任何警告,int 的值为 10。即使我将float 更改为 10.9 或 10.3 之类的值,答案也是一样的。即使输入cast 也不会改变结果。
谁能告诉我为什么会发生这种情况以及在什么情况下结果会有所不同。
注意:编译时,面试官告诉我不要添加gcc标志。
编辑:现在我明白了,浮点数不会四舍五入,答案是 10。但是有人能解释一下为什么这样设计吗?为什么任何浮点数在转换为 int 时会在下面四舍五入?有什么具体原因吗?
【问题讨论】:
-
对于警告,它取决于编译器及其设置。对于行为,它是指定的方式。您对为什么语言规范这么说感兴趣吗?
-
@user2864740,哎呀,我不知道。抱歉,那你能解释一下为什么会这样吗?
-
@juanchopanza,是的,我对语言为什么这么说很感兴趣。
-
我不希望出现警告,因为将
float表达式分配给int变量时必须发生的事情完全由 C 标准指定。编译器如何知道程序员并不打算发生这种情况? -
这里没有进行舍入。只是截断。小数部分被忽略,整数部分分配给
int。
标签: c casting floating-point int type-conversion