为什么在需要整数值时使用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
?特别是在初始化的情况下,声明的类型就在那里?
答案 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?
例如,因为double
和float
具有不同的精度。由于浮点数很奇怪并且通常不直观,因此从double
到float
(有损)的转换可能会产生与您实际想要的值不同的值。 t手动指定float
类型。
答案 3 :(得分:0)
在大多数情况下,这只是说出你的意思。
例如,你当然可以写:
#include <math.h>
...
const double sqrt_2 = sqrt(2);
并且编译器会在将int
值2
传递给double
之前生成一个隐式转换(注意:不一个强制转换) {1}}功能。因此,调用sqrt
等同于sqrt(2)
,很可能会生成完全相同的机器代码。
但sqrt(2.0)
更明确。对于读者来说,(稍微)更明显的是参数是一个浮点值。对于采用sqrt(2.0)
参数的非标准函数,编写double
而非2.0
可能很多更清晰。
你可以在这里使用整数文字,因为参数恰好是一个整数; 2
必须使用浮点文字和
我的问题是:为什么要在需要浮点值的上下文中使用整数文字?这样做几乎是无害的,因为编译器会生成隐式转换,但是通过编写sqrt(2.5)
而不是2
可以获得什么? (我不认为保存两次击键是一项重要的好处。)