1

背景

我正在尝试在 mac 上使用 clang 学习 C++11。

问题

正如书中所说,当浮点类型在算术中遇到int或小写时,后者将转换为float。在以下情况下确实如此:

cout << 9.0 / 5 << endl;

结果 yield 1.8000,但是当我尝试使用 suffix 来确保常量的类型时,例如:

cout << 9.0f / 5i << endl;

结果产生1。我想知道为什么?其背后是否有不同的规则或机制?

4

1 回答 1

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.0float ,则将是您想要的,否则它将被解释为double

5也将转换为浮点数,因为/运算符将对它的操作数执行通常的算术转换

于 2014-07-01T14:17:42.197 回答