我见过人们像这样初始化浮点变量的代码:
float num = 0.0f;
这与仅执行以下操作之间有显着区别吗?
float num = 0;
谢谢.. :)
float x = 0具有从 int 到 float 的隐式类型转换。
float x = 0.0f没有这样的类型转换。
float x = 0.0具有从 double 到 float 的隐式类型转换。
根据编译器的不同,隐式类型转换可能需要编译器生成额外的代码。
可能原因是他们曾经写过类似的东西:
float f = 1 / i; // i an integer
经过调试后,他们发誓要充分装饰文字以获得正确的类型:
float f = 1.0f / i;
在这种情况下,.0
是为了确保除法是浮点数,而不是整数除法。这f
是因为不需要在其中完成操作double
——我希望有更多的机会实现在1.0/i
没有任何好处的情况下显着变慢(软件浮动仿真、无关优化),而不是在1.0f
没有任何好处的情况下显着变慢(如果 double 比 float 快,那是因为你有 fp 硬件,所以两者之间的转换会非常快,所以不会引入显着的减速)。
你已经养成了装饰文字的习惯,你可能会这样写:
float f = 0.0f;
float f = 0.0;
即使它与or具有完全相同的效果float f = 0;
。
当然作者可能没有亲自经历过这个启示,他们可能只是继承了其他人的风格。
我只想写0
。
R.. 在评论中指出另一个答案,写 0 还具有这样的好处,即当您f
将来更改类型时,您不必更新文字以匹配。如果分配与定义分开,则更改:
float f = something
// some time later
f = 0.1f;
到:
double f = something;
// some time later
f = 0.1f;
可能是一个错误。0.1
如有必要,最好使用并让编译器截断以浮动。您可能会争辩说 usingfloat
根本就是一种优化,如果不是为了时间,也是为了空间,处理 float 和 double 之间的任何差异的负担应该算作执行该优化的开发人员成本。
用相同类型的字面常量初始化变量只是一种好的做法。在这种情况下,你有一个浮点变量,你应该用一个浮点字面常量来初始化它,即0.0f
,而不是一个 int ( 0
),然后隐式转换为一个浮点数。
好吧,严格来说,0 是一个整数,因此float num = 0
需要从整数转换为浮点数。但我想编译器无论如何都会为你做这个。我猜人们使用0.0f
它是为了强调这是一个浮点数,所以没有人将它误认为是一个整数。
Paul R 写下了答案。你的第二个例子有一个整数初始化值。
您应该始终使用与正在初始化的变量相同类型的初始化程序。这避免了在编译时(理想情况下)或运行时的任何转换(懒惰的编译器:有这么懒惰的吗?)。也许更重要的是,在一般情况下,转换可能会导致一些奇怪的事情。
这里的转换应该完全符合预期,但它仍然是很好的风格并且避免了编译器警告。
'f' 表示你想要一个 float :
0 是一个整数
0f 是一个浮点数
0.0 是双倍
0.0f 是一个浮点数
我看不出有任何理由将其用于初始化过程。但是,对于涉及浮点文字的操作,这将很有用。例如;
float a=0.43, b;
b = 0.5*a + 2.56*a*a;
没有后缀的浮点文字被认为是双精度。因此,对于这个计算,“a”将被强制转换为双精度,而 RHS 评估的最终答案将是双精度。在赋值过程中,RHS 的双精度值被强制转换为浮点数并赋值给“b”。如果机器没有双精度 FPU,这会降低性能。为了避免这种情况并使用浮点数进行整个计算。使用后缀。例如,
float a=0.43, b;
b = 0.5f*a + 2.56f*a*a;