隐式转换会在编译器遇到两个类型不同的操作数的时候自动进行。C++对于其基本内置类型有一套固定的类型转换规则,虽然说开发人员不需要写什么额外的符号或语句,但是为了更好地了解程序的行为并有效进行调试,了解这一套规则还是非常有必要的。
这一套规则的原则是尽量保持精度,因此精度低的类型(float)会往精度高的类型(double)转换,而存储空间小的类型(char)也会往空间大的类型(int)转换。
动手写3.4.1
动手写3.4.1展示了表达式中出现不同类型的数值时进行的隐式转换。运行结果如图3.4.1所示:
图3.4.1 基本隐式转换
我们可以看到,int往float转换(反过来的话,小数点后的值会被省略),char往int转换(反过来的话,int会被截断成char范围内的数字)。unsigned与signed的转换比较复杂,其中还涉及了溢出的问题,在这里我们不做讲解,也不鼓励大家在实际编程中使用。
除此之外,隐式转换还有几种特殊的情况,我们一一用示例进行讲解。
动手写3.4.2
动手写3.4.2展示了赋值语句中的隐式转换。运行结果如图3.4.2所示:
图3.4.2 赋值中的隐式转换(www.xing528.com)
由于赋值语句的左值有着确定的类型,右边的表达式不管在计算中发生了什么样的类型转换,最后都要转换成左值的类型。动手写3.4.2中,尽管加法中int转成了double,但是最后计算好的double还是要转回int。
动手写3.4.3
动手写3.4.3展示了条件操作符或条件语句(第4章的内容)中的任何表达式都要转换为布尔型,这是因为在这两个地方我们需要布尔值来做一个“两个分支”的选择。在这里只有0会转换为false,其他值将一律转换成true,所以这里的4转换成了true,而条件操作符将3赋值给了num。运行结果如图3.4.3所示:
图3.4.3 条件操作符中的隐式转换
此外,变量赋值给const修饰的常量时会自动发生从变量到常量的隐式转换,比如“int a = 1;const int b = a;”。最后我们用下面这个流向图来总结C++中基本内置类型的转换规则:
bool→char→unsigned char→short(wchar_t)→unsigned short(wchar_t)→int→unsigned int→long int→unsigned long int →float→double→long double
总结起来就是以下几点:
1.非浮点类型从短类型转换到长类型。
2.非浮点类型转换到浮点类型。
3.低精度浮点类型转换到高精度浮点类型。
4.signed类型转换到unsigned类型。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。