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

c++ constant type conversion in arithmetics

本文关键字:常量 类型转换 c++      更新时间:2023-10-16

背景

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

问题

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

cout << 9.0 / 5 << endl;

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

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

结果得到CCD_ 2。我想知道为什么?它背后有不同的规则或机制吗?

使用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;
~~~          ~~~~~^~~~

因此,看起来_Complex没有过载,因此结果被转换为bool。使用以下示例,我们可以更清楚地看到这一点:

float f = (9.0f / 5 + 0i) ;
std::cout << f << std::endl ;

其输出CCD_ 8。

如果您只想要int文字,则不需要后缀,其他积分后缀分别为u, l, ul, ll, ullunsigned, long, unsigned long, long long and unsigned long long

所以在你的情况下:

9.0f / 5

如果您希望确保9.0被解释为浮点,否则它将被解释为双精度。

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