![C++入门很轻松(微课超值版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/983/44509983/b_44509983.jpg)
4.4 表达式中的类型转换
![](https://epubservercos.yuewen.com/0133F4/23721642901033906/epubprivate/OEBPS/Images/Figure-P82_11206.jpg?sign=1738884949-VocTbKC0CvFsmjuiH4QQSlPfV24JQJNO-0-a318fec924cf161c630aa2346ff2e644)
微视频
在表达式的计算过程中,如果遇到不同的数据类型参与运算,C++编译器就会将数据类型进行转换。在C++中转换数据类型的方法有两种:一种是自动转换,另一种是强制转换。
4.4.1 自动转换
C++语言中预设了不同类型数据参与运算时的转换规则,编译器会自动进行数据类型的转换,进而计算出最终结果,这就是自动转换。数据类型的自动转换规则示意图如图4-18所示。
![](https://epubservercos.yuewen.com/0133F4/23721642901033906/epubprivate/OEBPS/Images/Figure-P83_11219.jpg?sign=1738884949-91A5b4LOMlZvr5IXoNgJghYtSoZQyEHr-0-e4fa33b74a56409b7e2dd0e2ac705e08)
图4-18 数据类型的自动转换规则示意图
C++编译器在自动转换数据类型时,遵循以下规则。
(1)如果参与运算量的数据类型不同,则先转换成同一类型,然后进行运算。
(2)自动转换数据类型按数据长度增加的方向进行,以保证精度不降低。例如int型和long型运算时,会先把int型转成long型,再进行运算。
(3)所有的浮点运算都是以双精度进行的,即使为仅含float单精度量运算的表达式,也要先转换成double型,再进行运算。
(4)char型和short int型参与运算时,必须先转换成int型。
(5)在赋值运算中,赋值号两边量的数据类型不同时,赋值号右边量的类型将转换为左边量的类型。如果右边量的数据类型长度比左边长,转换后将丢失一部分数据,丢失的部分按四舍五入向前舍入,这样会降低精度。例如:
int i; i=2 + 'A';
其运算规则是先计算“=”右边的表达式,此为整型和字符型的混合运算,按照数据类型转换先后顺序,把字符型'A'转换为int型得65,然后求和得67,最后把67赋予变量i。
再如:
double d; d=2+'A'+1.5F;
其运算规则是先计算“=”右边的表达式,此为整型、字符型和浮点型的混合运算,因为有浮点型参与运算,所以“=”右边表达式的结果为float类型。按照数据类型转换先后顺序,分别把字符型'A'转换为double型65.0,把整型2转换为2.0,把浮点型1.5F转换为1.5,然后求和得68.5,最后把双精度浮点数68.5赋予变量d。
上述两种情况都是由低精度类型向高精度类型转换,如果逆向转换,可能会出现丢失数据的风险,甚至编译器会以警告的形式给出提示。例如:
int i; i=1.2;
浮点数1.2舍弃小数位后,把整数部分1赋予变量i。如果i=1.9,运算后变量i的值依然是1,而不是2。
【实例4.17】数据类型自动转换的应用,编程计算圆的面积(源代码\ch04\4.17.txt)。
#include <iostream> using namespace std; int main(){ float PI=3.14159; int s,r=8; s=r*r*PI; printf("s=%d\n",s); }
程序运行结果如图4-19所示。从运算结果可以看出,虽然变量PI为浮点型;变量s和r为整型,但在执行s=r*r*PI语句时,r和PI都被转换成double型,计算结果也为double型。又由于s为整型,故赋值结果仍为整型,舍去了小数部分,最后输出结果为201。
![](https://epubservercos.yuewen.com/0133F4/23721642901033906/epubprivate/OEBPS/Images/Figure-P84_11398.jpg?sign=1738884949-2tzQoaJ7h7axnSuG7mqgg26GWGFS557o-0-b0cc72c2d1a16778959f351ecc2a47ae)
图4-19 例4.17的程序运行结果
4.4.2 强制转换
当数据类型需要转换时,有时编译器会给出警告,提示程序会存在潜在的隐患。如果非常明确地希望转换数据类型,就需要用到显式类型转换,也就是常说的强制转换。其一般格式如下:
(类型说明符) (表达式)
其功能是把表达式的运算结果强制转换成类型说明符所标示的类型。例如:
(float) a /*把a转换为实型*/ (int)(x+y) /*把x+y的结果转换为整型*/
在数据类型需要强制转换时,应注意以下问题。
(1)类型说明符和表达式都必须加括号(单个变量可以不加括号)。若把(int)(x+y)写成(int)x+y,则表示把x转换成int型,再与y相加。
(2)无论是强制转换还是自动转换,都只是为了满足当前运算的需要而对变量的数据长度进行临时性转换,而不是改变数据说明时为该变量定义的类型。
【实例4.18】数据类型强制转换的应用(源代码\ch04\4.18.txt)。
#include <iostream> using namespace std; int main() { float f, x = 3.6, y = 5.2; int i = 4, a, b; a = x + y; b = (int)(x + y); f = 10 / i; printf("a=%d,b=%d,f=%f,x=%f\n", a, b, f, x); return 0; }
程序运行结果如图4-20所示。从运算结果可以看出,本实例中先计算x+y,然后将其值8.8赋予变量a,因为变量a为整型,所以自动取整数部分8,输出a=8;接下来执行语句b=(int)(x+y),把x+y强制转换为整型;最后执行语句f=10/i,两个整数相除后结果仍为整数2,把2赋予浮点型变量f;x为浮点型,直接输出。
![](https://epubservercos.yuewen.com/0133F4/23721642901033906/epubprivate/OEBPS/Images/Figure-P84_11415.jpg?sign=1738884949-sdrfcz5EElh7CcBvMzJ0meKuGfL3o7zS-0-c3546b6dc92b22bed597009afb464e15)
图4-20 例4.18的程序运行结果