这些行是否产生相同的编译代码?
double one = 1.0;
double one = 1.f;
double one = 1;
还是这三个?
float one = 1.0;
float one = 1.f;
float one = 1;
修改
假设右侧的值可以存储为32位浮点数
答案 0 :(得分:7)
除非编译器能够证明在编译时转换等同于在运行时进行转换,否则不允许在编译时转换它们。当编译器能够证明这一点时,对于很多类型来说很容易,大多数编译器都会在编译时执行转换。
但您提供的一个示例是从类型double
的字面值到float
类型的转换。这变得棘手。对于支持浮点状态标志的编译器(当使用FENV_ACCESS
编译指示时,C编译器需要支持,即使gcc和clang都没有实现该编译指示),这样的转换可能会产生副作用#34;不精确"如果从double
到float
的转换失去精确度,则会出现异常。在您的情况下,精度不会丢失,但例如, float f = 1.1;
,几乎可以肯定。如果float f = 1.1;
和float f = 1.1f;
具有明显不同的行为,则编译器无法将其转换为另一个。
答案 1 :(得分:2)
在实践中,如果他们没有,我会感到惊讶。这些语句非常简单,可以在编译时轻松解决。
但是,严格地说,你不能也不应该依赖于此。在语义上,这里有转换,所以结果可能不是你所期望的。如果你的代码依赖于此,那么你可能会做一些奇怪的事情。