算术中的c++常量类型转换
c++ constant type conversion in arithmetics
背景
我正试着用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, ull
和unsigned, long, unsigned long, long long and unsigned long long
。
所以在你的情况下:
9.0f / 5
如果您希望确保9.0
被解释为浮点,否则它将被解释为双精度。
5
也将转换为浮点,因为/
运算符将对其操作数执行常规算术转换。
相关文章:
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- C++中的双指针类型转换
- 逐位操作的隐式类型转换
- 模板中的类型转换
- 在 C++(和 C)中进行类型转换时明显不一致
- 字符类型转换不兼容
- 将复杂的非基元C++数据类型转换为 Erlang/Elixir 格式,以使用 NIF 导出方法
- 错误:请求从"常量字符 [5]"转换为非标量类型"字符串"
- 如何为具有常量类型的函数正确转换来自 DLsym 的返回值?
- 另一个:从"常量类型*"到"类型*"的转换无效
- 字符串常量之前的预期构造函数、析构函数或类型转换
- C++大小写中的类型转换常量字符串
- 具有常量/非常量指针类型的模板的自动类型转换
- C++中的部分常量类型转换
- 将常量字符* 类型转换为 int 数组
- 为什么将整数文本类型转换为指针值会导致非常量表达式
- 转换为常量类型,初始化数组
- 算术中的c++常量类型转换
- 如何在C++中启用从常量到常量的隐式类型转换