4.8.1 自动转换

自动转换发生在不同数据类型的混合运算中,由编译系统自动完成。自动转换需要遵循如下5条原则。

❑ 若参与运算的变量类型不同,则先转换成同一类型,然后再进行运算。

❑ 按数据长度增加的方向进行转换,以保证精度不降低。如整型和长整型进行运算时,先把整型量转成长整型后再进行运算。

❑ 所有的浮点运算都是以双精度进行的,即使仅含单精度运算的表达式,也要先转换成双精度型,再进行运算。

❑ 字符型和短型变量参与运算时,必须先转换成整型。

❑ 在赋值运算中,当赋值号两边的数据类型不同时,赋值号右边的类型将转换为左边的类型。如果右边的数据类型长于左边,则将丢失一部分数据,这样会降低精度,丢失的部分按四舍五入进行舍入。

上述转换原则的具体描述如图4-8所示。

图4-8 变量转换原则

在图4-8中,横向箭头是运算时必须要进行的转换。例如字符型必须转换为整型才可以运算,单精度型必须转换为双精度型才能运算。纵向箭头表示当运算对象的类型不同时的转换方向,例如字符型和单精度型进行运算时,应将字符型转为双精度型后运算。

需要注意的是,字符型转为双精度型的过程是一次性的,不需要中间过程,其他转换同样。不同类型的数据只有转换为图4-8所示的相交节点时才能进行运算。看下面的一段代码。

    #include <stdio.h>
    int main(void)
    {
      float PI=3.14159;
      int s, r=5;
      s=r*r*PI;
      printf("s=%d\n", s);
    }

在上述代码中,PI为实型,s和r为整型。在执行面积计算语句“s=r*r*PI”时,r和PI都转换成双精度型然后计算,结果也为双精度型。但由于s为整型,故赋值结果仍为整型,它舍去了小数部分。

再看下面的代码。

    m*n+'b'+23-d/e

在上述运算中,需要将m转换为整型,n转换为单精度型,b和d转换为双精度型,e转换为长型。

因为C语言和其他语言一样,都是从左向右扫描运算式的,所以上述运算的具体步骤如下所示。

第1步:计算m×n,整型和单精度型转换为双精度型,先将m、n转换为双精度型,再计算,结果为双精度型。

第2步:'b’为字符,转换为双精度型后与第1步结果进行相加,结果为双精度型。

第3步:23为整型,转为双精度型后运算,结果为双精度型。

第4步:“/”运算的优先级高于“-”运算,所以先计算d/e,e转换为双精度型后运算,结果为双精度型。

请看下面的实例:计算圆的大概面积和精确面积的过程。

实例4-7

计算圆的大概面积和精确面积

源码路径daima\4\4-7

本实例的实现文件为“zidong.c”,具体代码如下。

    int main(void){
        float PI = 3.14159;
        int s1, r = 5;
        double s2;
        s1 = r*r*PI;
        s2 = r*r*PI;
        printf("圆的大概面积是%d, 精确面积是
%f \n", s1, s2);
    }

代码编写完毕后,执行效果如图4-9所示。

图4-9 执行效果

拓展范例及视频二维码

范例4-7-01:变量内存地址的理解

源码路径:演练范例\4-7-01\

范例4-7-02:使用转义序列字符

源码路径:演练范例\4-7-02\