算术中的c ++常量类型转换

时间:2014-07-01 14:05:21

标签: c++ c++11 clang clang-extensions

背景

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

问题

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

cout << 9.0 / 5 << endl;

结果产生1.8000,但是当我尝试使用后缀来确保常量的类型时:

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

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

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 ,因为/运算符将对其操作数执行通常的算术转换