为什么在不需要时使用float / double文字呢?

时间:2014-05-27 20:23:45

标签: c implicit-conversion floating-point-conversion

为什么在需要整数值时使用double或float文字,并且整数文字将被隐式地转换为double / float?当需要一个小数值时,为什么还要加上f(以形成一个浮点字面值),其中double将被转换为浮点数?

例如,我经常看到与以下内容类似的代码

float foo = 3.0f;
double bar = 5.0;
// And, unfortunately, even
double baz = 7.0f;

void quux(float foo) {
     ...
}

...

quux(7.0f);

但据我所知,这些相当于

float foo = 3;
// or
// float foo = 3.0;
double bar = 5;
double baz = 7;
quux(9);

如果您使用的是重载语言(c ++,java),我可以理解方法调用,如果函数过载(或将来会),它实际上可以产生功能差异,但我是更关注C(以及较小程度的Objective-C),它没有超载。

那么有没有理由打扰额外的小数和/或f?特别是在初始化的情况下,声明的类型就在那里

4 个答案:

答案 0 :(得分:4)

许多人学到了很难的方法

double x = 1 / 3;

无法按预期工作。所以他们(包括我自己)通过使用浮点文字而不依赖于隐式转换来防御性地编程。

答案 1 :(得分:3)

C没有重载,但它有一些叫做可变参数的函数。这是.0重要的地方。

void Test( int n , ... )
{
    va_list list ;
    va_start( list , n ) ;
    double d = va_arg( list , double ) ;
    ...
}

调用函数而不指定数字是一个double会导致未定义的行为,因为va_arg宏会将变量内存解释为double,而实际上它是一个整数。

Test( 1 , 3 ) ;必须为Test( 1 , 3.0 ) ;


但你可能会说;我永远不会写出变量函数,所以为什么要这么麻烦?

printf(和系列)是可变函数。

电话会产生警告:

printf("%lf" , 3 ) ;   //will cause undefined behavior

但是根据警告级别,编译器以及忘记包含正确的标题,您根本不会收到任何警告。

如果切换类型,也会出现问题:

printf("%d" , 3.0 ) ;    //undefined behaviour

答案 2 :(得分:2)

  

为什么在需要整数值时使用double或float文字,并且整数文字将被隐式地强制转换为double / float?

首先,“隐式演员”是矛盾的(根据定义,演员阵容是明确的)。您正在寻找的表达式是“隐式[类型]转换”。

至于为什么:因为它更明确(没有双关语意)。如果你有一些关于文字类型的视觉指示,那对眼睛和大脑会更好。

  

为什么还要添加f(浮点数字),否则double会被转换为float?

例如,因为doublefloat具有不同的精度。由于浮点数很奇怪并且通常不直观,因此从doublefloat(有损)的转换可能会产生与您实际想要的值不同的值。 t手动指定float类型。

答案 3 :(得分:0)

在大多数情况下,这只是说出你的意思。

例如,你当然可以写:

#include <math.h>
...
const double sqrt_2 = sqrt(2);

并且编译器会在将int2传递给double之前生成一个隐式转换(注意:一个强制转换) {1}}功能。因此,调用sqrt等同于sqrt(2),很可能会生成完全相同的机器代码。

sqrt(2.0)更明确。对于读者来说,(稍微)更明显的是参数是一个浮点值。对于采用sqrt(2.0)参数的非标准函数,编写double而非2.0可能很多更清晰。

你可以在这里使用整数文字,因为参数恰好是一个整数; 2必须使用浮点文字和

我的问题是:为什么要在需要浮点值的上下文中使用整数文字?这样做几乎是无害的,因为编译器会生成隐式转换,但是通过编写sqrt(2.5)而不是2可以获得什么? (我不认为保存两次击键是一项重要的好处。)