C++ c++;算术中的常数类型转换 背景
我正试图在mac上用C++11进行学习 问题: 正如书中所说,当浮点类型在算术中遇到int或小写时,后者将转换为float。在以下情况下也是如此: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
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