如果两种类型可以相互转换,它们就是关联的。c++语言不会直接将两种不同类型的值相加,而是先根据类型转换规则及那个运算对象的类型统一后再求值。
1、隐式转换
隐式转换的类型转换是自动执行的,无须程序员介入。在下面的情况下,编译器会执行隐式转换:
- 大多数表达式中,比int类型小的整型值首先提升为较大的整数类型。
- 条件表达式中,非布尔型转换成布尔型。
- 初始化时,初始值变成变量类型。
- 赋值语句中,右侧对象转换成左侧对象的类型。
- 函数调用时发生的类型转换。
(1)算术转换
(1.1)整型提升
将小整数类型转换成较大的整数类型,对bool、char、signed char、unsigned char、short和unsigned short等类型来说,只要它们所有可能的值都存在int里,它们就会提升成int型,否则提升成unsigned int型;对较大的char类型(wchart_t、char16_t、char32_t)提升成int、unsigned int、long、unsigned long、long long和unsigned long long中最小的一种类型,前提是转换后的类型能容纳原类型所有可能的值。
(1.2)转换规则
算数转换将运算对象换成最宽的类型,比如表达式中既有整型又有浮点型,运算时会将整型变换成浮点型进行运算。算术运算首先执行整型提升,如果提升后的类型一致则不需要进一步的类型转换,否则要执行类型转换。如果运算对象符号一致,要么都是无符号的、要么都是有符号的,则小类型运算对象转换成较大类型。否则,符号不一致(含有无符号类型的)的运算则需要注意:
- 无符号的类型不小于带符号类型的(无符号类型大),则带符号对象转换成无符号的。
- 无符号类型小于带符号类型(无符号类型小),转换结果依赖机器:如果无符号类型的所有值都能存在该带符号类型中,则无符号对象转换成带符号类型,否则,带符号对象转换成无符号的类型。
(2)其他转换
- 数组转换成指针
但当数组被用作decltype关键字的参数、取地址符(&)、sizeof、typeid等运算符的运算对象时,转换不会发生。
- 函数类型自动转换成函数指针。
- 算数类型或指针类型自动转换成布尔类型:
char *cp=get_char();
if(cp);//如果指针不是0,为真
if(*cp);//如果指针指向的值不是空字符,为真
- 非常量类型的指针(或引用)转换成常量类型:
int i;
const int &j=i;/非常量转换成常量的引用
const int *p=&i;//非常量转换成指向常量的指针
- 类类型定义的转换
string s="a value";//字符串字面值转换成string类型
while(cin>>s);//cin转换成bool值
2、显式转换
暂时不看