所有花车都是双打?

时间:2013-06-25 08:17:19

标签: c++

我正在读教科书,上面写道:

  

默认情况下,C ++会将您在程序源代码中输入的所有浮点数(例如7.33和0.0975)视为double值。

我发现这有点奇怪,从未听说过。似乎浪费了?如果不指定,为什么要获得额外的精度?为什么有两种不同的类型意味着相同的东西?那么长的双倍呢?

3 个答案:

答案 0 :(得分:20)

这是语言规范的一部分。如果你想要一个双,写:

auto a = 12.3;

如果你想要一个浮点数,请写:

auto a = 12.3f;

如果你想要一个长双,写:

auto a = 12.3L;

来源:MSDN

2.14 Literals一章的C ++标准中广泛描述了整个主题。

答案 1 :(得分:7)

这仅指floating-point literals

这与您在代码中编写的任何整数都被视为(带符号)int的情况相同。只要将其分配给变量,就会得到变量的类型。

但是,在计算中使用独立文字时,您将获得该计算的文字类型,可能会触发隐式类型转换:

float f = 3.141;    // f is of type float, even though the literal was double
auto d = f * 2.0;   // d will be of type double because of the literal 2.0
auto f2 = f * 2.0f; // f2 will be of type float again

第二行的计算涉及两种不同的类型:变量的类型 ffloat。即使它是从double文字构造的,变量的类型也是重要的。另一方面,文字 2.0类型是double,因此会触发计算的隐式转换。因此,实际乘法作为两个double s的乘法执行。

如果您希望独立值具有特定类型,请使用匹配的文字。

答案 2 :(得分:4)

我实际上认为书中的文字是正确的。我正在解释一下:

  

默认情况下,12.3等浮点值为double

换句话说,如果你没有在数字末尾添加字母“f”,那么为了使它12.3f,它确实是一个双倍。

大多数情况下(如果浮点计算只是代码的一小部分),这没什么区别,但如果你有浮点变量,并使用double常量进行初始化和比较,那么是floatdouble的额外转换。当然,例如,常量所需的存储量会更大。