c++ - 'float a = 3.0;' 是正确的说法吗?

标签 c++ c++11

如果我有以下声明:

float a = 3.0 ;

这是一个错误吗?我在一本书中读到 3.0 是一个 double 值,我必须将其指定为 float a = 3.0f。是这样吗?

最佳答案

声明 float a = 3.0 不是错误:如果你这样做了,编译器会为你将 double 字面量 3.0 转换为 float 。


但是,您应该在特定场景中使用浮点文字表示法。

  1. 出于性能原因:

    具体来说,考虑:

    float foo(float x) { return x * 0.42; }
    

    在这里,编译器将为每个返回值发出一个转换(您将在运行时支付)。为避免这种情况,您应该声明:

    float foo(float x) { return x * 0.42f; } // OK, no conversion required
    
  2. 为避免比较结果时出现错误:

    例如以下比较失败:

    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)

  3. 调用正确的重载函数(出于同样的原因):

    例子:

    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;
    }
    
  4. 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;
    }
    

Live demo

关于c++ - 'float a = 3.0;' 是正确的说法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25229832/

相关文章:

c++ - 模板结构中的友元运算符引发重新定义错误

c++ - 如何正确地将变量传入和传出非默认构造函数?

c++ - Clion如何部署项目?

c++ - 基于交换的排序算法的交换次数的奇偶性

c++ - 99% CPU,3.51MB 没有 typedef

c++ - 构造函数作为函数尝试 block - 异常中止程序

c++ - QMYSQL驱动加载错误

php - 修改(创建 PHP 扩展)Makefile 以包含 C++ 类和代码

c++ - 在 Visual C++ 和 clang 中使用 C++11 unordered_set

c++ - 在 OSX 上用 GCC 编译后如何运行命令行程序?