C ++运算符中的隐式类型转换规则是什么?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (25)

我想更好地知道在C++中添加、乘时的隐式类型转换规则是什么?例如,

int + float = ?
int * float = ?
float * int = ?
int / float = ?
float / int = ?
int / int = ?
int ^ float = ?

等等等等..。

提问于
用户回答回答于

在C ++操作符(对于POD类型)中,总是作用于相同类型的对象。 因此,如果他们不是一样的人将被提升为匹配其他。 操作结果的类型与操作数相同(转换后)。

If either is      long          double the other is promoted to      long          double
If either is                    double the other is promoted to                    double
If either is                    float  the other is promoted to                    float
If either is long long unsigned int    the other is promoted to long long unsigned int
If either is long long          int    the other is promoted to long long          int
If either is long      unsigned int    the other is promoted to long      unsigned int
If either is long               int    the other is promoted to long               int
If either is           unsigned int    the other is promoted to           unsigned int
If either is                    int    the other is promoted to                    int
Both operands are promoted to int

注意。操作的最小尺寸是int。所以,short/ char被提升到int操作完成之前。

在所有表达式中,在执行操作之前将其int提升为a float。操作的结果是a float

int + float =>  float + float = float
int * float =>  float * float = float
float * int =>  float * float = float
int / float =>  float / float = float
float / int =>  float / float = float
int / int                     = int
int ^ float =>  <compiler error>
用户回答回答于

包含float结果的算术运算float

int + float = float
int * float = float
float * int = float
int / float = float
float / int = float
int / int = int

有关更详细的答案。看看C ++标准第5/9节的内容

许多期望算术或枚举类型的操作数的二元运算符会以类似的方式导致转换并产生结果类型。目的是产生一个共同的类型, 这也是结果的类型。 这种模式被称为通常的算术转换,其定义如下: - 如果任一操作数的类型是long double,则另一个应转换为long double。 - 否则,如果其中一个操作数是双倍的,另一个应转换为双倍。 - 否则,如果任一操作数是浮点数,则另一个操作数应转换为浮点数。 - 否则,整体促销(4.5)应在两个操作数上执行.54) - 然后,如果任一操作数无符号长整型,另一个将被转换为无符号长整型。 - 否则,如果一个操作数是一个long int而另一个是unsigned int,那么如果一个long int可以表示一个unsigned int的所有值,那么unsigned int将被转换为一个long int; 否则两个操作数都应转换为unsigned long int。 - 否则,如果任一操作数很长,另一个应转换为long。 - 否则,如果任一操作数是无符号的,则另一个应转换为无符号。 [注意:否则,唯一的情况是两个操作数都是int]

扫码关注云+社区