
2.3.6 不同类型数据之间的混合运算
当不同类型的数据在运算符的作用下构成表达式时要进行类型转换,即把不同的类型先转换成统一的类型,然后再进行运算。
例如,假定i为整型,值为2,f定义为浮点型,值为1.8,计算:
10+'A'+i*f-5
则从左到右扫描:
①计算10+'A',将'A'转换为整数65,再和10相加,得到75。
②*运算优先级高,先算i*f,将i转换为float类型得2.0,再计算2.0*1.8,得值3.6。
③将10+'A'的结果75和i*f的结果3.6相加,得值78.6。
④将10+'A'+i*f的结果减去5,计算78.6-5,最终得值73.6。
上面的类型转换过程编译系统自动完成,用户无须关心。
相关知识5
通常数据之间的转换遵循的原则是“类型提升”,即如果一个运算符有两个不同类型的操作数据,那么在进行运算之前,先将较低类型的数据提升为较高类型,从而使两者的类型一致(但数值不变),然后再进行运算,其结果是较高类型的数据。类型的高低是根据其数据所占用的空间大小来判定的,占用空间越多,类型越高;反之越低。各种类型数据之间的转换如图2-3所示。

图2-3 标准类型数据转换规则
当较高类型的数据转换成较低类型的数据时,称之为降格。
1.运算符的优先级与结合性
在C语言中,要想正确使用一种运算符,必须清楚这种运算符的优先级和结合性。当一个表达式中出现不同类型的运算符时,首先按照它们的优先级顺序进行运算,即先运算优先级高的运算符,再运算优先级低的运算符。当两类运算符的优先级相同时,则要根据运算符的结合性确定运算顺序。
结合性表明运算时的结合方向。有两种结合方向:一种是从左向右,一种是从右向左(具体可参看附录C)。
2.表达式类型的确定
表达式类型的确定涉及下面几项:
①算术表达式的类型是由该表达式中各个操作数的类型决定的。若表达式中各个操作数的类型相同,则表达式的类型就是某个操作数的类型。如果表达式中各个操作数的类型不同,则表达式的类型应是各操作数中类型高的操作数的类型。
②赋值表达式的类型取决于左侧数值的类型。执行赋值表达式时,先计算等式右侧表达式的值,再将表达式的类型转换为等式左侧变量的类型,然后进行赋值。
③逗号表达式的类型取决于该表达式中最右边表达式的类型。
课后讨论
C语言中各种运算符及其表达式的作用。
技能训练—变量及其表达式的运算
训练目的与要求:学会数据类型定义和运算符的使用。
训练题目:阅读下面的程序写出结果。

案例解析:程序中int a,b,c;表示定义三个整型变量,以逗号分隔,用于存储三个整型数。float x,y;表示定义两个实型变量,以逗号分隔,用于存储两个实型数据。a=b=1;将1送给b和a。后面的4行是赋值运算,最后输出各变量的值。
程序的运行结果为:
x=1.000000,y=3.500000
a=2,b=3,c=3
能力拓展—交换两个变量的值
两个变量a=5,b=8的值进行交换有两种方法,读者可以进行验证。
①借助于第三个变量t,用下列语句段完成:

最终a=8,b=5,完成交换。
②不借助于第三个变量,用下列语句段完成:

最终a=8,b=5,也完成交换。
说明:变量在内存中的存储具有“新来旧往”的特性,总是用最新的值代替原来的值。