初始化时(0.0),0.0f的意义是什么?

我见过人们初始化浮点变量的代码,如下所示:

float num = 0.0f; 

这与下面的内容之间是否存在显着差异?

 float num = 0; 

谢谢.. :)

float x = 0有一个从int到float的隐式类型转换。
float x = 0.0f没有这样的类型转换。
float x = 0.0有一个从double到float的隐式类型转换。

根据编译器的不同,隐式类型转换可能需要编译器生成额外的代码。

初始化具有相同类型的文字常量的变量只是一种良好的做法。 在这种情况下,你有一个浮点变量,你应该用浮点文字常量初始化它,即0.0f ,而不是int( 0 )然后隐式地转换为浮点数。

可能原因是他们曾经写过类似的东西:

 float f = 1 / i; // i an integer 

经过调试后,他们发誓总是装饰文字,以获得正确的类型:

 float f = 1.0f / i; 

在这种情况下, .0是为了确保除法是浮点,而不是整数除法。 f是因为没有必要以double方式完成操作 – 我预计实现的可能性更大,其中1.0/i将明显慢于无益(软件浮点仿真,无差别优化),而不是1.0f没有任何好处会显着减慢(如果double比浮动快,那是因为你有fp硬件,所以两者之间的转换将非常快,因此不会引入显着的减速)。

你养成了装饰文字的习惯,你可能会写:

 float f = 0.0f; 

即使它与float f = 0.0;具有完全相同的效果float f = 0.0;float f = 0;

当然作者可能没有亲自经历过这个启示,他们可能只是inheritance了其他人的风格。

我只写0

R ..在评论中指出另一个答案,即写0还有一个好处,即当你将来改变f的类型时,你不必更新文字来匹配。 如果赋值与定义分开,则更改:

 float f = something // some time later f = 0.1f; 

至:

 double f = something; // some time later f = 0.1f; 

可能是一个bug。 最好使用0.1并让编译器在必要时截断浮动。 您可能会争辩说,使用float是一种优化,对于空间,如果不是时间,并且处理float和double之间的任何差异的负担应该被计算为执行该优化的开发人员成本。

好吧,严格来说,0是一个整数,所以float num = 0需要从整数到浮点数的转换。 但我想编译器无论如何都会为你做这件事。 我猜人们使用0.0f来强调这是一个浮点数,所以没有人会误认为是一个整数。

保罗R写了答案。 您的第二个示例具有整数初始化值。

您应该始终使用与正在初始化的变量相同类型的初始值设定项。 这避免了在编译时(理想情况下)或运行时的任何转换(懒惰的编译器:这些是懒惰的吗?)。 也许更重要的是,在一般情况下,转换可能会导致一些奇怪的事情。

这里转换应该完全符合预期,但它仍然是好的样式并避免编译器警告。

‘f’表示你想要一个浮点数:

0是一个int

0f是一个浮点数

0.0是双倍的

0.0f是一个浮点数

我没有看到任何理由将其用于初始化过程。 但是,对于涉及浮点文字的操作,这将是有用的。 例如;

 float a=0.43, b; b = 0.5*a + 2.56*a*a; 

没有后缀的浮点文字被认为是双精度数。 因此,对于这个计算,“a”将被打字加倍,RHS评估的最终答案将是双倍。 在赋值期间,RHS的double值被转换为float并指定为“b”。 如果机器没有双精度FPU,这会降低性能。 为避免这种情况,请使用float进行整个计算。 使用后缀。 例如,

 float a=0.43, b; b = 0.5f*a + 2.56f*a*a;