背景
我正在尝试在 mac 上使用 clang 学习 C++11。
问题
书上说,当float型在算术上遇到int或小写时,后者会转为float。在以下情况下是正确的:
cout << 9.0 / 5 << endl;
结果是 1.8000
,但是当我尝试使用后缀来确保常量的类型时,例如:
cout << 9.0f / 5i << endl;
结果为 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
for unsigned,分别为 long、unsigned long、long long 和 unsigned long long
。
所以在你的情况下:
9.0f / 5
如果您想确保 9.0
被解释为 float ,这将是您想要的,否则它将被解释为 double。
5
也将被转换为 float,因为 /
运算符将执行通常的算术转换在它的操作数上。
关于c++算术中的常量类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24512299/