C++ c++;算术中的常数类型转换 背景

C++ c++;算术中的常数类型转换 背景,c++,c++11,clang,clang-extensions,C++,C++11,Clang,Clang Extensions,我正试图在mac上用C++11进行学习 问题: 正如书中所说,当浮点类型在算术中遇到int或小写时,后者将转换为float。在以下情况下也是如此: cout << 9.0 / 5 << endl; 结果产生1。我想知道为什么?它背后有不同的规则或机制吗?使用i作为后缀,表示一个虚常量,而不是gcc也支持的整数。如果没有警告,则clang只会将5i解释为复数。打开“警告”(特别是-Wconversion)后,它会发出以下警告: warning: imaginary con

我正试图在mac上用C++11进行学习

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

cout << 9.0 / 5 << endl;

结果产生
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;
~~~          ~~~~~^~~~
输出
1.8

如果您只需要整数文字,则不需要后缀,其他整数后缀分别是
无符号、长、无符号长、长和无符号长的
u、l、ul、ll、ull

因此,在你的情况下:

9.0f / 5
如果您想确保
9.0
被解释为浮点数,那么这将是您想要的,否则它将被解释为双精度


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

您是如何编译它的
i
不是一个内置的数字后缀(特别是,它不像您认为的那样代表
int
)。要编译此文件,必须在程序中的某个地方定义一个
运算符“i()
;找到它,看看它是什么。
5i
是一个虚数(即复数0+5i),不是整数5。@402不是现成的。正如Igor所说,编译器不知道如何处理
5i
。@tgmath在Clang v3.4中似乎是这样,不一定是@IgorTandetnik,我想我误解了“I”。谢谢。但是说实话,test.cpp中没有其他的
操作符“I()
。我只是简单地包括
iostream
,并直接使用该行。
float f = (9.0f / 5 + 0i) ;
std::cout << f << std::endl ;
9.0f / 5