文字是否在编译时进行了类型转换?

时间:2016-07-01 17:27:35

标签: c++ c

这些行是否产生相同的编译代码?

double one = 1.0;
double one = 1.f;
double one = 1;

还是这三个?

float one = 1.0;
float one = 1.f;
float one = 1;

修改

假设右侧的值可以存储为32位浮点数

2 个答案:

答案 0 :(得分:7)

除非编译器能够证明在编译时转换等同于在运行时进行转换,否则不允许在编译时转换它们。当编译器能够证明这一点时,对于很多类型来说很容易,大多数编译器都会在编译时执行转换。

但您提供的一个示例是从类型double的字面值到float类型的转换。这变得棘手。对于支持浮点状态标志的编译器(当使用FENV_ACCESS编译指示时,C编译器需要支持,即使gcc和clang都没有实现该编译指示),这样的转换可能会产生副作用#34;不精确"如果从doublefloat的转换失去精确度,则会出现异常。在您的情况下,精度不会丢失,但例如, float f = 1.1;,几乎可以肯定。如果float f = 1.1;float f = 1.1f;具有明显不同的行为,则编译器无法将其转换为另一个。

答案 1 :(得分:2)

在实践中,如果他们没有,我会感到惊讶。这些语句非常简单,可以在编译时轻松解决。

但是,严格地说,你不能也不应该依赖于此。在语义上,这里有转换,所以结果可能不是你所期望的。如果你的代码依赖于此,那么你可能会做一些奇怪的事情。