我在一个程序中看到了“1 / 3.f”,并想知道“.f”是什么用的。所以尝试了我自己的程序:
#include<iostream>
using namespace std;
int main()
{
cout<<(float)1/3<<endl;
cout<<1/3.f<<endl;
cout<<1/3<<endl;
}
.f是否像演员一样使用?我可以在哪里阅读更多有关这种有趣语法的内容吗?
答案 0 :(得分:55)
3.
相当于3.0
,它是双倍的。
f
使它成为一个浮点数。
答案 1 :(得分:44)
如果没有.f
,则数字会被解释为整数,因此1/3
为(int)1/(int)3
=&gt; (int)0
而不是所需的(float)0.333333
。 .f
告诉编译器将文字解释为float类型的浮点数。还有其他此类构造,例如0UL
表示(unsigned long)0
,而普通0
则表示(int)0
。
.f
实际上是两个组件,.
表示文字是浮点数而不是整数,f
后缀告诉编译器文字应该是float类型,而不是用于浮点文字的默认double类型。
声明;上面解释中使用的“强制转换构造”不是实际的强制转换,而只是表示文字类型的一种方式。
如果您想了解所有关于文字和可以在其中使用的后缀的内容,您可以阅读C ++标准,(1997 draft,C++11 draft,C++14 draft,{{3} }或者,看看一本体面的教科书,例如Stroustrup的C++17 draft。
顺便说一下,在你的例子(float)1/3
中,文字1
和3
实际上是整数,但是1首先由你的演员投射到浮点数,然后是3隐式转换为float,因为它是浮点运算符的右手操作数。 (运算符是浮点数,因为它的左手操作数是浮点数。)
答案 2 :(得分:18)
默认情况下,3.2
被视为double
;所以为了强制编译器将其视为float
,你需要在最后写f
。
看看这个有趣的演示:
float a = 3.2;
if ( a == 3.2 )
cout << "a is equal to 3.2"<<endl;
else
cout << "a is not equal to 3.2"<<endl;
float b = 3.2f;
if ( b == 3.2f )
cout << "b is equal to 3.2f"<<endl;
else
cout << "b is not equal to 3.2f"<<endl;
输出:
a不等于3.2
b等于3.2f
在ideone上进行实验:http://www.ideone.com/WS1az
尝试将变量a
的类型从float
更改为double
,再次查看结果!
答案 3 :(得分:8)
3.f是3.0f的缩写 - 3.0作为float类型的浮点文字。
答案 4 :(得分:2)
小数点和f有不同的目的,所以它不是真正的.f
你必须明白,在C和C ++中,所有内容都是打字的,包括文字。
3是一个字面整数。 3.是双字面的 3.f是文字浮点数。
IEEE float的精度低于double。 float只使用32位,22位尾数和10位指数(包括每个的符号位)。
double为您提供更高的准确性,但有时您不需要这样的准确性(例如,如果您正在计算的数字只是首先估计的数字)并且浮点数给出的就足够了,并且如果您存储大数字它们(例如处理大量时间序列数据)可能比准确性更重要。
因此,浮动仍然是一种有用的类型。
您不应将此与printf和等效语句使用的符号混淆。