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

标签 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。我想知道为什么?背后是否有不同的规则或机制?

最佳答案

使用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/

相关文章:

编译所有依赖项并将其链接到 LLVM 位码

c++ - 计算平均值 C++

c++ - END_COM_MAP 中 IUnknown 成员函数的用途是什么?

c++ - 通过链接实现静态或全局的多个实例

c++ - 如何在 C++ 中迭代字符串和结构的映射?

c++ - 'std::fstream'打开失败是否抛异常?

c++ - 我可以在基类模板方法中自动推导出子类型吗?

c - 如何正确解决指针对齐增加的问题?

c++ - 在 union 中设置字段位的最佳方法

c++ - 适用于 Windows 的 LLVM C++ IDE