背景
我正在尝试在 mac 上使用 clang 学习 C++11。
问题
正如书中所说,当浮点类型在算术中遇到int或小写时,后者将转换为float。在以下情况下确实如此:
cout << 9.0 / 5 << endl;
结果 yield 1.8000
,但是当我尝试使用 suffix 来确保常量的类型时,例如:
cout << 9.0f / 5i << endl;
结果产生1
。我想知道为什么?其背后是否有不同的规则或机制?
我正在尝试在 mac 上使用 clang 学习 C++11。
正如书中所说,当浮点类型在算术中遇到int或小写时,后者将转换为float。在以下情况下确实如此:
cout << 9.0 / 5 << endl;
结果 yield 1.8000
,但是当我尝试使用 suffix 来确保常量的类型时,例如:
cout << 9.0f / 5i << endl;
结果产生1
。我想知道为什么?其背后是否有不同的规则或机制?
用作i
后缀是一个扩展 ,它表示一个虚构的常数,而不是一个也支持的整数gcc
。如果没有警告,使clang
能只会解释5i
为复数。打开警告(特别是 -Wconversion)它会给出以下警告:
warning: imaginary constants are a GNU extension [-Wgnu-imaginary-constant]
std::cout << 9.0f / 5i << std::endl;
^
warning: implicit conversion discards imaginary component: '_Complex float' to 'bool' [-Wconversion]
std::cout << 9.0f / 5i << std::endl;
~~~ ~~~~~^~~~
所以看起来没有重载 for_Complex
所以结果被转换为bool。使用以下示例,我们可以更清楚地看到这一点:
float f = (9.0f / 5 + 0i) ;
std::cout << f << std::endl ;
哪个输出1.8
。
如果您只想要一个int文字,则不需要后缀,其他整数后缀分别u, l, ul, ll, ull
为 for unsigned, long, unsigned long, long long and unsigned long long
。
所以在你的情况下:
9.0f / 5
如果您想确保将其解释9.0
为float ,则将是您想要的,否则它将被解释为double。
5
也将转换为浮点数,因为/
运算符将对它的操作数执行通常的算术转换。