如果我有以下声明:
float a = 3.0 ;
这是一个错误吗?我在一本书中读到 3.0
是一个 double
值,我必须将其指定为 float a = 3.0f
。是这样吗?
最佳答案
声明 float a = 3.0
不是错误:如果你这样做了,编译器会为你将 double 字面量 3.0 转换为 float 。
但是,您应该在特定场景中使用浮点文字表示法。
出于性能原因:
具体来说,考虑:
float foo(float x) { return x * 0.42; }
在这里,编译器将为每个返回值发出一个转换(您将在运行时支付)。为避免这种情况,您应该声明:
float foo(float x) { return x * 0.42f; } // OK, no conversion required
为避免比较结果时出现错误:
例如以下比较失败:
float x = 4.2; if (x == 4.2) std::cout << "oops"; // Not executed!
我们可以用浮点文字符号来修复它:
if (x == 4.2f) std::cout << "ok !"; // Executed!
(注意:当然是 this is not how you should compare float or double numbers for equality in general)
调用正确的重载函数(出于同样的原因):
例子:
void foo(float f) { std::cout << "\nfloat"; } void foo(double d) { std::cout << "\ndouble"; } int main() { foo(42.0); // calls double overload foo(42.0f); // calls float overload return 0; }
As noted by Cyber ,在类型推导上下文中,需要帮助编译器推导一个
float
:如果是
auto
:auto d = 3; // int auto e = 3.0; // double auto f = 3.0f; // float
同样,在模板类型推导的情况下:
void foo(float f) { std::cout << "\nfloat"; } void foo(double d) { std::cout << "\ndouble"; } template<typename T> void bar(T t) { foo(t); } int main() { bar(42.0); // Deduce double bar(42.0f); // Deduce float return 0; }
关于c++ - 'float a = 3.0;' 是正确的说法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25229832/