gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 11:59:41 25 4
gpt4 key购买 nike

如果我有以下声明:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com