看到这样的事情会感到惊讶:
float f = 10.25f;
int i = (int)f;
// Will give you i = 10
收益是什么?
OTOH 10.25是与10完全不同的东西,这一点大家都同意,这样的软转换可能会发生不好的事情。
哪种语言会引发错误?
可能会出现这样的情况:"Error: Can't represent 10.25 as an integer"
。
同时给出的答案的WRT :是的,它可能被认为是可靠的,就像"round“这样的函数一样。但不是直接从cast期望的数据/信息的完整性的WRT。
也许一个默认行为为"int“的函数"truncate”会是一个更好的选择?
发布于 2013-11-14 18:34:53
它恰好是
(int)f
这说明程序员知道他在做什么,而在大多数编程语言中,悄悄地去掉小数部分并将其余部分存储在整数中是被禁止的。
顺便说一句,这不仅仅是小数部分被切断了。同样重要的是,一个浮点数可以有一个非常大的值,以至于它不可能被表示为int。考虑一下:
(int) 1e20f
发布于 2013-11-14 18:36:21
语句int i = (int)f;
明确表示“请将我的浮动f
转换为int
”。这当然是我经常发现的一件有用的事情--为什么你不能将一个浮点值从某种计算转换成一个整数呢?类型转换将告诉编译器“我真的希望它是一个整数”,就像在C中可以执行char *p = (char *)1234567;
一样--类型转换是为了告诉编译器“我真的知道我在做什么”。
如果你使用int i = f;
或int i = 10.25;
,编译器仍然会做你“要求的”--将浮点值转换为整数。如果您启用了相应的警告,它可能会发出警告,提示“您正在将float
转换为int
”。
C和C++是需要你理解你在做什么,以及后果是什么的语言--其他一些语言设置了更多的“障碍”来防止这样的事情发生,但这通常意味着编译器必须添加额外的代码来在运行时进行检查-C和C++被设计成“快速”语言。
这有点像开车,在后面有一堵墙的时候倒车,然后踩油门,很可能会导致汽车撞到墙上--如果这不是你想要的,那就“不要这么做”。
发布于 2013-11-14 18:33:23
首先,转换绝对是“可靠的”,就像“它总是做同样的事情”一样。
你想不想这样做由你自己决定。一般而言,C/C++语言被设计为给程序员提供大量的低级能力,这意味着程序员需要知道他们在做什么。如果浮点数到整型数的转换让您感到惊讶,那么您需要更仔细地考虑。
事实上,GCC有一个选项-Wconversion
,它将突出这样的案例。它在默认情况下是不启用的,也不是-Wall
或-Wextra
的一部分(大概是因为大多数程序员都很好地理解和“预期”了这种行为),但是如果您需要的话,这个选项就在那里。
除了它不会给出警告之外,在本例中,因为您的代码包含显式的强制转换(int)
,所以编译器假定您是故意这样做的。
这会给出一个警告(使用-Wconversion
):
int i = f;
这不会:
int i = (int)f;
https://stackoverflow.com/questions/19974285
复制相似问题