C++ 为什么自动将这个变量推断为double而不是float?

C++ 为什么自动将这个变量推断为double而不是float?,c++,floating-point,literals,auto,type-deduction,C++,Floating Point,Literals,Auto,Type Deduction,在下面的代码段中,auto将变量推断为double,但我想要float auto one = 3.5; 它是否总是对带小数点的文字使用double?它是如何决定浮点和双精度的?文本3.5的类型是double。对于float请使用3.5f 您可以使用查看各种类型的信息。3.5是一种双文字。因此,auto正确地将其类型推断为double。您仍然可以使用它初始化float变量,但最正确的方法是使用float文本,如3.5f。末尾的f称为后缀。浮点文字的后缀为: (无后缀)定义双精度 ff定义浮点

在下面的代码段中,
auto
将变量推断为
double
,但我想要
float

auto one = 3.5;

它是否总是对带小数点的文字使用
double
?它是如何决定浮点和双精度的?

文本
3.5
的类型是
double
。对于
float
请使用
3.5f


您可以使用查看各种类型的信息。

3.5
是一种
文字。因此,
auto
正确地将其类型推断为
double
。您仍然可以使用它初始化
float
变量,但最正确的方法是使用
float
文本,如
3.5f
。末尾的
f
称为后缀。浮点文字的后缀为:

  • (无后缀)定义双精度
  • f
    f
    定义浮点
  • l
    l
    定义长双精度
<>除此之外,C++和(c)中也有后缀,

,默认情况下,除非按<代码> f或f或L或L >指定,否则浮点字被视为<代码>双< /代码>。 本标准包括以下内容:

2.14.4 除非由后缀显式指定,否则浮点文本的类型为double。后缀f和f指定 浮点,后缀l和l指定长双精度。如果缩放值不在其类型的可表示值范围内,则程序格式错误

因此,

auto one = 3.5;
始终是
double
,如果您打算
float
它应该编码为

auto one = 3.5f;

C++中浮点文字的类型是自动<代码>双< /代码>,除非:

  • f
    是后缀,在这种情况下,文本的类型是
    float

  • L
    是后缀,在这种情况下,文本的类型是
    long double

  • 因此,如果希望变量为
    浮点
    ,请执行以下操作:

    auto one = 3.5f;
    

    要回答您的确切问题(而不是您想知道的内容)auto以这种方式推导,因为模板是以这种方式推导的。模板这样推断是因为函数重载(函数重载规则用于打破关系)推导
    double
    与生成
    intf(float)的规则相同;int f(双)f(3.5)
    时,选择
    f(双精度)
    。您的问题与
    auto
    无关,它只涉及浮点文本
    3.5
    的类型和类别,因为
    3.5
    是一个
    双精度
    ,而不是
    float
    @JustinTime:虽然在C中,字符文本是type
    int
    ,但是,当C看起来像C的代码被编译成C和C++编译器时,这会引起微妙的错误,但是取决于字符文字是具体的代码> char < /> >或<代码> int >代码(更有趣的是,可能取决于代码的定义,即代码< char < /Code >)。