资源预览内容
第1页 / 共6页
第2页 / 共6页
第3页 / 共6页
第4页 / 共6页
第5页 / 共6页
第6页 / 共6页
亲,该文档总共6页全部预览完了,如果喜欢就下载吧!
资源描述
C 语言隐式类型转换规章C 语言规定,不同类型的数据需要转换成同一类型后才可进展计算,在整型、实型和字符型数据之间通过类型转换便可以进展混合运算(但不是全部类型之间都可以进展转换).当混合不同类型的变量进展计算时,便可能会发生类型转换一样类型的数据在转换时有规章可循:字符必需先转换为整数(C 语言规定字符类型数据和整型数据之间可以通用) short 型转换为 int 型(同属于整型)float 型数据在运算时一律转换为双精度(double)型,以提高运算精度(同属于实型)赋值时,一律是右部值转换为左部类型注当整型数据和双精度数据进展运算时,C 先将整型数据转换成双精度型数据,再进展运算,结果为双精度类型数据当字符型数据和实型数据进展运算时,C 先将字符型数据转换成实型数据,然后进展计算,结果为实型数据2.4 数据类型转换在 C 语言的表达式中,准许对不同类型的数值型数据进展某一操作或混合运算。当不同类型的数据进展操作时,应当首先将其转换成一样的数据类型,然后进展操作。数据类型转换有两种形式,即隐式类型转换和显示类型转换。2.4.1 隐式类型转换所谓隐式类型转换就是在编译时由编译程序依据确定规章自动完 成,而不需人为干预。因此,在表达式中假设有不同类型的数据参与同一运算时,编译器就在编译时自动依据规定的规章将其转换为一样的数据类型。C 语言规定的转换规章是由低级向高级转换。例如,假设一个操作符带有两个类型不同的操作数时,那么在操作之前行先将较低的类型转换为较高的类型,然后进展运算,运算结果是较高的类型。更精准地说,对于每一个算术运算符,则遵循图 2-2 所示的规章。图 2-2 数据类型转换规章之一留意:在表达式中,全部的 float 类型都转换为double 型以提高运算精度。在赋值语句中,假设赋值号左右两端的类型不同,则将赋值号右边的值转换为赋值号左边的类型,其结果类型还是左边类型。由于函数参数是表达式,因此,当参数传递给函数时,也发生类型转换。具体地说, char 和 short 均转换为 int;float 转换为 double。这就是为什么我们把函数参数说明为 int 和 double,尽管调用函数时用char 和 float .也可以将图 2-2 所示的规章用图 2-3 表示。图 2-3 中的水平箭头表示必定转换,纵向箭头表示两个操作对象类型不同时的转换方向。图 2-3 数据类型转换规章之二下面进展说明类型转换的规章。例如执行:x=100+”a”+1.5 * u+f/”b”-s * 3.1415926其中,u 为 unsigned 型,f 为 float 型,s 为 short 型,x 为 float 型。式中右面表达式按如下步骤处理:(1) 首先将”a”、”b”和s 换成 int,将 1.5 和 f 转换为double 型。(2) 计算 100+”a”,因”a”已转换为 int 型,于是此运算结果为 197。(3) 计算 1.5*u,由于 1.5 已转换为 double,u 是 unsigned 型,于是首先 u 转换为double,然后进展运算,运算结果为double。(4) 计算 197+1.5 * u,先将 197 转换为double如 197.0000,其结果为 double。(5) 计算 f/ ”b”,f 已转换为 double,”b”已转换为 int,于是先将”b”再转换为 double, 其结果为 double。(6) 计算197+1.5 * u+f / ”b”,者均为double,于是结果也为 double。(7) 计算 s * 3.1415926,先将 s 由int 转换为double,然后进展运算,其结果为 double。(8) 最终与前面得的结果相减,结果为 double。(9) 最终将表达式的结果转换为 float 并赋给 x。2.4.2 显式类型转换显示类型转换又叫强制类型转换,它不是依据前面所述的转换规章进展转换,而是直接将某数据转换成指定的类型。这可在很多状况下简化转换。例如,int i;i=i+9.801依据隐式处理方式,在处理 i=i+9.801 时,首先 i 转换为 double 型,然后进展相加, 结果为 double 型,再将double 型转换为整型赋给 i。int i;i=i+int9.801这时直接将 9.801 转换成整型,然后与 i 相加,再把结果赋给 i。这样可把二次转换简化为一次转换。显示类型转换的方法是在被转换对象或表达式前加类型标识符,其格式是:类型标识符表达式例如,有如下程序段: mainint a,b; float c; b=a+intc;printf“b=d% n“,b;在上述程序的运行过程中,在执行语句 b=a+intc时,将 c 的值临时强制性转化为int 型,但变量 c 在系统中仍为实型变量,这一点很重要,不少初学者在这个问题上无视了这个问题。2.5 运算符和表达式 2.5.1 运算符和表达式概述 1表达式一个表达式包含一个或多个操作,操作的对象称作运算元或叫作操作数,而操作本身通过运算符表达的。例如a、a-b、c=9.801 等都是一个表达式。一个表达式完成一个或多个操作,最终得到一个结果,而结果的数据类型由参与运算的操作打算。最简洁的表达式是只含一个常量或变量的表达式,即只含一个操作数而不含运算符。C 语言中表达式的种类格外丰富,主要有如下一些:n算术表达式:进展一般的计算。n赋值表达式:进展赋值操作。 n关系表达式:进展比较推断。n规律表达式:进展规律比较推断。n条件表达式:进展条件满足与否的推断。n逗号表达式:实际上是一种简洁运算,可以包含多个算术表达式。2C 语言的操作符 C 语言的特点之一是具有丰富和使用灵敏的运算符,概括起来它有如下的几类运算符:n算术运算符。n赋值运算符包括符合赋值运算符。n关系运算符。n规律运算符。n条件运算符。n逗号运算符。n位运算符。n指针运算符。n求字节运算符可以归并到函数的应用中去,它是通过函数 sizeof来进展运算的。n强制类型转换运算符。这些运算符如表 2-4 所示。表 2-4 C 语言中的运算符名称操作符自增,自减+ +,- -规律与、或、非,! 续表 24名称操作符指针操作及引用*,加、减、乘、除、求模运算+,*,/,%关系操作符,=,= =,! =按位与、或、异或、求反&,丨,逗号表达式,类型转换移位运算 条件运算?:求占用的字节数sizeof赋值=,+ =, =,*=,/ =,% =先看程序:#include #includeint main(int argc, char*argv) unsigned int right = 1; char left = -1;if(left right)printf(“%d %dn“, left, right); system(“PAUSE“);return 0;运行结果是:-1 1解释:按步骤进展.1. 假设其中一个操作数为 long double 类型,则另一个操作数被转换为 long double.2. 否则,假设其中一个操作数为 double, 则另一个操作数被转换为double.3. 否则,假设其中一个操作数为 float, 则另一个操作数也转换为float.4. 否则,两个操作数进展 “整型升级“:a. 假设其中一个操作数为 unsigned long int, 则另一个操作数也被视为 unsignedlong int.b. 否则,假设其中一个操作数为 long int,而另一个操作数类型是unsigned int, 并且long int 能够表示unsigned int 的全部值,则另一个操作数也被视为 long int;假设 long int 不能表示 unsigned int 的全部值,则两个数都被视为 unsigned long int.c. 否则, 假设其中一个操作数是 long int,则另一个操作数也被视为 long int.int.d. 否则, 假设其中一个操作数是 unsigned int, 则另一个操作数也被视为unsignede. 否则, 两个操作数都被视为 int.
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号