我正在尝试使用mac上的clang在C ++ 11中学习。
正如书中所说,当float类型在算术中遇到int或小写时,后者将被转换为float。在以下情况下确实如此:
cout << 9.0 / 5 << endl;
结果产生1.8000
,但是当我尝试使用后缀来确保常量的类型时:
cout << 9.0f / 5i << endl;
结果产生1
。我想知道为什么?背后有不同的规则或机制吗?
答案 0 :(得分:1)
使用i
作为后缀是an extension,它表示一个虚数常量,而不是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;
~~~ ~~~~~^~~~
所以看起来_Complex
没有重载,所以结果转换为 bool 。我们可以使用以下示例更清楚地看到这一点:
float f = (9.0f / 5 + 0i) ;
std::cout << f << std::endl ;
输出1.8
。
如果您只想要 int 文字,则不需要后缀,其他整数后缀分别为u, l, ul, ll, ull
unsigned, long, unsigned long, long long and unsigned long long
。
所以在你的情况下:
9.0f / 5
如果您想确保9.0
被解释为 float ,将是您想要的,否则它将被解释为 double 。
5
也将转换为 float ,因为/
运算符将对其操作数执行通常的算术转换。