3.10 强制类型转换
强制类型转换是C语言特有的程序执行方式,它是通过类型转换运算来实现的。其一般形式为:
(类型说明符)(表达式)
其功能是将表达式的运算结果强制转换成类型说明符所表示的类型。其中,类型说明符必须使用括号括起来。例如:(int)m表示把m转换为整型,(double)(a*b+c)表示把表达式a*b+c的值转换为双精度浮点型。使用强制转换时需注意:第一,类型说明符必须加括号;第二,表达式应该加括号,若表达式仅为单个变量可以不加;第三,强制类型转换不改变被转换对象,仅仅为本次运算所需而进行的操作。
范例3.14 CalcVandS.c
CalcVandS.c计算半径r,高h的圆柱形桶的体积V和表面积S,取圆周率为3.14,要求计算结果为整型并输出,体积V四舍五入,表面积S仅取整数部分。(光盘\chat3\ CalcVandS.c)
01 #include<stdio.h> 02 main() 03 { 04 float radius_value=5.2; //定义半径r 05 float height_value=20.3; //定义高h 06 float volume_value; //定义体积V 07 float area_value; //定义表面积S 08 int integ_volume; //定义整型体积 09 int integ_area; //定义整型表面积 10 volume_value=PI*radius_value*radius_value*height_value; //计算体积V 11 area_value=2.0*PI*radius_value*height_value; //计算表面积S 12 integ_volume=(int)(volume_value+0.5); //强制转换体积 13 integ_area=(int)(area_value); //强制转换表面积 14 printf("圆柱体积的浮点值及表面积 =%f, area=%f\n", volume_value, area_value); 15 printf("圆柱体积的整型值及表面积 =%d, area=%d\n", integ_volume, integ_area); 16 }
程序中初始化了半径 r 和 h,通过算式获得体积和表面积的实际值volume_value和area_value后,需要根据要求取整数值。由于强制类型转换是由float型到int型,仅取数值的整数部分,因此对于四舍五入方式,需要使用0.5作增量。
程序运行结果为:
圆柱体积的浮点值及表面积= 1723.583496, area = 662.916478
圆柱体积的整型值及表面积= 1724, area = 663
强制类型转换还可用于避免两个整型值进行算术除运算而造成结果错误。例如求算式:a!÷b!,其中a,b皆为整数,b = a+2,且a = 3,程序如下:
01 int a_fac=0; 02 int b_fac=0; 03 float ab_div=0.0; 04 a_fac=1*2*3; 05 b_fac=a_fac*4*5; 06 ab_div=a_fac/b_fac; 07 printf("%f", ab_div);
执行这段程序发现输出结果并不是我们想要的数值,而是0.000000。原因就是在C语言中,对于两个整型数据的除法运算,其商仅是运算结果的整数部分,因此输出结果为浮点数0.000000。那么如何避免出现这样的错误呢?其实很简单,只要在程序第6行加入强制类型转换即可,第6行修改程序如下:
ab_div = (float)a_fac/b_fac;
将变量a_fac强制转换为float型之后,计算机将隐含转换为浮点运算,因此结果也将保留浮点值并赋给变量ab_div。将修改后的程序重新编译运行,得到结果:
0.050000
强制类型转换的另一重要应用是对指针的类型转换,后续章节将对这一知识点做详细介绍。