第二章数据类型运算符和表达式

上传人:新** 文档编号:584519441 上传时间:2024-08-31 格式:PPT 页数:90 大小:629.50KB
返回 下载 相关 举报
第二章数据类型运算符和表达式_第1页
第1页 / 共90页
第二章数据类型运算符和表达式_第2页
第2页 / 共90页
第二章数据类型运算符和表达式_第3页
第3页 / 共90页
第二章数据类型运算符和表达式_第4页
第4页 / 共90页
第二章数据类型运算符和表达式_第5页
第5页 / 共90页
点击查看更多>>
资源描述

《第二章数据类型运算符和表达式》由会员分享,可在线阅读,更多相关《第二章数据类型运算符和表达式(90页珍藏版)》请在金锄头文库上搜索。

1、华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计第第2章章数据类型、运算符和表达式数据类型、运算符和表达式2.1 数据类型2.2 常量和变量2.3 运算符和表达式2.4 位运算2.5 运算符的优先级2.6 格式化输入输出函数的进一步讨论2.7 常见问题分析华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计2.1数据类型数据类型在在C语言中,数据类型可分为语言中,数据类型可分为:华中科技大学信息学院华中科技大学信息学院华中科技大

2、学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计2.2常量和变量常量和变量2.2.1 常量(常量(文字量文字量)1.整型常量整型常量:整型常量就是整常数。:整型常量就是整常数。(1)十进制整型常量十进制整型常量:例如例如56、-100、2004;(2)八进制整常量八进制整常量:必须以必须以0开头开头,数码取值为数码取值为07。如:如:017(15)10、0101(65)10、0177777(65535)10;(3)十六进制整常量十六进制整常量:前缀为前缀为0X或或0x,其数码取值为,其数码取值为09,AF或或af。如:如:0X2A(42)10、0xA0(16

3、0)10、0XFFFF(65535)10;(4)整型常量的后缀(整型常量的后缀(L/l、H/h):如果使用的数超过了整型数的范围,就必须用长整型数来表示。长整如果使用的数超过了整型数的范围,就必须用长整型数来表示。长整型数是用后缀型数是用后缀“L”或或“l”来表示的。如:来表示的。如:158L(十进制为十进制为158),012L(十进制为十进制为10)华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计2.浮点型常量浮点型常量:也称为实型:也称为实型 它有二种形式:它有二种形式:十进制小数形式十进制小数形式指数形

4、式指数形式(1)十进制小数形式:由数字)十进制小数形式:由数字09和小数点组成和小数点组成(注意必须有小数点注意必须有小数点)如:如:0.0、5.0、3.14、.0、0.(2)指数形式:)指数形式:一般形式为:一般形式为:整数部分整数部分.小数部分小数部分(e,E)n后缀后缀符号符号表示该组成部分为可选项,但必须遵守浮点数的下列组成规则:表示该组成部分为可选项,但必须遵守浮点数的下列组成规则:一个浮点数可以无整数部分或小数部分,但不能二者全无;一个浮点数可以无整数部分或小数部分,但不能二者全无;一个浮点数可以无小数点或指数部分,但不能二者全无;一个浮点数可以无小数点或指数部分,但不能二者全无;

5、如:如:.234e+12,25E5,1.23,+1.23e-4f华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计3. 字符型常量:用单引号括起来的一个字符 ,单引号中的内容不能是单引号,双引号和反斜线。字符常量的值就是该字符的ASCII码值。如:a 、C、 =、 +、 ? 转义字符转义字符是一种特殊的字符常量。转义字符以反斜线是一种特殊的字符常量。转义字符以反斜线“”开头,后跟一个或几个字符。转义字符具有特定的含义,不开头,后跟一个或几个字符。转义字符具有特定的含义,不同于字符原有的意义。同于字符原有的意义。

6、 广义地讲,C语言ASCII字符集中的任何一个字符均可用转义字符来表示,如: 101表示字母A ,102表示字母B。 华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计常用的转义字符如下表所示: 转义字符转义字符的意义ASCII代码 n回车换行 10 t横向跳到下一制表位置 9 b退格 8 r回车 13 f走纸换页 12 反斜线符() 92 单引号符() 39 双引号符(“) 34 a鸣铃 7 0空字符(=NULL) ddd13位八进制数所代表的字符 xhh12位十六进制数所代表的字符华中科技大学信息学院华中科

7、技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计例2.1 转义字符的使用#include void main( ) char ch; ch=36; /将ASCII码为36即30的字符赋给ch printf(“ch is %cn”,ch); /输出字符,ASCII码为36对应的字符为$ 输出结果为:ch is $华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计4. 字符串常量:由一对双引号括起的字符序列。字符串常量和字符常量是不同的量。它们之间主要有字

8、符串常量和字符常量是不同的量。它们之间主要有以下区别:以下区别:(1)字符常量由单引号括起来,字符串常量由双引号字符常量由单引号括起来,字符串常量由双引号括起来。括起来。(2)字符常量只能是单个字符,字符串常量则可以含字符常量只能是单个字符,字符串常量则可以含一个或多个字符。一个或多个字符。(3)可以把一个字符常量赋予一个字符变量,但不能可以把一个字符常量赋予一个字符变量,但不能把一个字符串常量赋予一个字符变量。把一个字符串常量赋予一个字符变量。(4)字符常量占一个字节的内存空间。字符串常量占字符常量占一个字节的内存空间。字符串常量占的内存字节数等于字符串中字符数加的内存字节数等于字符串中字符

9、数加1。增加的。增加的一个字节中存放字符一个字节中存放字符0(ASCII码为码为0)。这是。这是字符串结束的标志。字符串结束的标志。华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计5.符号常量符号常量 : 常量除了用上述直接表示方法外,还可以采用符号表示,常量除了用上述直接表示方法外,还可以采用符号表示,称为符号常量称为符号常量(又称又称宏宏)使用符号常量的好处是:使用符号常量的好处是:含义清楚;能做到含义清楚;能做到“一改全改一改全改”。符号常量在使用之前必须先定义,其一般形式为:符号常量在使用之前必须先定

10、义,其一般形式为:#define标识符标识符常量常量#define是预处理命令(预处理命令都以是预处理命令(预处理命令都以“#”开头),开头),称为宏定义命令。其功能是把该标识符定义为其后的常量值。称为宏定义命令。其功能是把该标识符定义为其后的常量值。如:如:#definePI3.14/C的常量形式,无类型的常量形式,无类型C的常量:的常量:constdoublepi3.14; /有类型华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计例2.2 采用宏定义的方式定义符号常量#include #define PI

11、 3.14159 /定义符号常量PI,值为3.14159void main( ) double radius = 10.0; double perimeter; double area; perimeter = 2 * PI * radius; /使用符号常量 area = PI * radius *radius; /使用符号常量 printf(radius=%lf,perimeter=%lf,area=%6.2lfn, radius,perimeter,area);输出结果为:radius=10.000000,perimeter=62.831800,area=314.16华中科技大学信息学院

12、华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计2.2.2变量变量在程序执行过程中,值可以改变的量称为变量。在程序执行过程中,值可以改变的量称为变量。变量数据类型的说明格式为:变量数据类型的说明格式为:数据类型数据类型变量名表变量名表=初值初值; 例:例:int a,b,c; float f, g=3.0;变量的命名必须遵循以下几条规则变量的命名必须遵循以下几条规则:(1)必须是以英文字母或下划线开头的,由字母、数字和下划线组成必须是以英文字母或下划线开头的,由字母、数字和下划线组成的字符序列。的字符序列。(2)(2)不能与不能

13、与C语言的关键字语言的关键字(保留字保留字)重名,重名,(3)(3)变量名的长度不受限制。但一般不超过变量名的长度不受限制。但一般不超过32个字符个字符(4)C语言对变量名的大小写敏感。语言对变量名的大小写敏感。(5)另外,在另外,在C语言的长期使用过程中还形成了一些约定俗成的规则:语言的长期使用过程中还形成了一些约定俗成的规则:尽量使变量名能够表达出该变量的含义。尽量使变量名能够表达出该变量的含义。用户最好不要用下划线来作为变量名的开头。用户最好不要用下划线来作为变量名的开头。习惯上符号常量的标识符用大写字母,变量标识符可大小写结合。习惯上符号常量的标识符用大写字母,变量标识符可大小写结合。

14、华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计1整型变量整型变量 在在C语言中语言中,整型用整型用int表示。根据整型数在存储器中占用的字节表示。根据整型数在存储器中占用的字节数,又可以用数,又可以用long和和short来修饰来修饰int,表示长整型和短整型。根据其是,表示长整型和短整型。根据其是否带有符号,又可以用否带有符号,又可以用signed和和unsigned来修饰来修饰int,shortint,longint表示带表示带符号整型和无符号整型。符号整型和无符号整型。 2.浮点型变量浮点型变量 fl

15、oat单精度型单精度型double双精度型双精度型longdouble长双精度型长双精度型3.字符变量字符变量 字符变量用来存储字符常量,即单个字符。字符变量的类型说明符是字符变量用来存储字符常量,即单个字符。字符变量的类型说明符是char,在,在C语言中,字符型也可以分为语言中,字符型也可以分为signed和和unsigned,它们的区别在于取,它们的区别在于取值范围的不同值范围的不同。可以把字符变量看成是整型量。可以把字符变量看成是整型量。C语言允许对整型变量赋以语言允许对整型变量赋以字符值,也允许对字符变量赋以整型值。在输出时,允许把字符变量按整型字符值,也允许对字符变量赋以整型值。在输

16、出时,允许把字符变量按整型量输出,也允许把整型量按字符量输出。量输出,也允许把整型量按字符量输出。华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计例例2.3字符变量与整型量之间的联系字符变量与整型量之间的联系#include void main( ) char ch=a; int i=ch; printf (%c ASCII is %dn,ch,ch); /将字符量按整型量处理 printf (%c ASCII is %dn,i,i); /将整型量按字符量处理输出结果为:a ASCII is 97a ASCI

17、I is 97周一9-10华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计2.3运算符和表达式运算符和表达式“运算符”就是记述各种不同运算过程的符号。按运算对象的数目: 单目运算符、双目运算符和三目运算符;按照其功能: 算术运算符、赋值运算符、关系运算符、 逻辑运算符、位运算符、自增自减运算符、 条件运算符、逗号运算符等等。华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计2.3.1表达式表达式2.3.2算术运算符与算术表达式

18、算术运算符与算术表达式2.3.3关系运算符与关系表达式关系运算符与关系表达式2.3.4逻辑运算符与逻辑表达式逻辑运算符与逻辑表达式2.3.5自增和自减运算自增和自减运算 2.3.6赋值运算符与赋值表达式赋值运算符与赋值表达式2.3.7条件运算符与条件表达式条件运算符与条件表达式2.3.8逗号运算符与逗号表达式逗号运算符与逗号表达式华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计2.3.1表达式表达式一般来讲,表达式是由运算符和运算量所组成的符合C的语法的算式。运算量可以是变量、常量、有返回值的函数等。从本质上

19、讲,表达式是对运算规则的描述并按一定规则执行运算的算式。 C语言中的表达式根据运算符的种类可以分为: 算术表达式、关系表达式、逻辑表达式、 赋值表达式、条件表达式、逗号表达式 混合表达式等。 华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计2.3.2算术运算符与算术表达式算术运算符与算术表达式C语言中,算术运算符有语言中,算术运算符有5个,它们的具体含义见下表个,它们的具体含义见下表:运算符运算符使用形式使用形式含义含义+单目或双目运算符单目或双目运算符单目运算表示单目运算表示正号正号,双目运算表示,双目运算

20、表示加法加法运运算算-单目或双目运算符单目或双目运算符单目运算表示单目运算表示求负求负,双目运算表示,双目运算表示减法减法运运算算*双目运算符双目运算符乘法运算乘法运算/双目运算符双目运算符除法运算除法运算%双目运算符双目运算符取模运算(求余数)取模运算(求余数)华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计关于算术运算符的使用有以下规则:关于算术运算符的使用有以下规则:(1)+、-、*、/运算符的运算量可为任何整型或浮点型的常运算符的运算量可为任何整型或浮点型的常(2)量、变量、有返回值的函数以及表达式。

21、量、变量、有返回值的函数以及表达式。(2)正如在数学中除法运算的除数不能为正如在数学中除法运算的除数不能为0一样,在一样,在x/y中,中,表表达式达式y的取值也不能为的取值也不能为0,否则将出现错误。,否则将出现错误。(3)%运算符要求运算量必须是整型,且运算符要求运算量必须是整型,且%后面的运算量不后面的运算量不能为能为0。例如例如:3%5结果为结果为3-17%5结果为结果为-220%10结果为结果为0华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计(4)当双目运算符的两个运算量的类型相同时,它们的运算当双

22、目运算符的两个运算量的类型相同时,它们的运算结果的类型与运算量类型相同。结果的类型与运算量类型相同。例如例如:17.5+2.5结果为浮点型结果为浮点型20.016/7结果为整型结果为整型2,小数部分被省去,小数部分被省去(5)当双目运算符的两个运算量的类型不同时,运算前遵循当双目运算符的两个运算量的类型不同时,运算前遵循类型的一般转换规则将运算量自动转换成相同的类型,运算类型的一般转换规则将运算量自动转换成相同的类型,运算结果的类型与转换后的运算量的类型相同结果的类型与转换后的运算量的类型相同(类型的一般转换类型的一般转换规则将在本章的后面介绍规则将在本章的后面介绍)。例如: 15.5 + 5

23、 操作数15.5的类型为浮点型,运算前将整型数5转换成浮点型数5.0,然后进行运算,结果为浮点型数20.5例如:例如:16/5.0结果为浮点型结果为浮点型3.2华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计例例2.4五种算术运算示例五种算术运算示例#includevoidmain()intx,y;floatx1,y1;x=15;y=6;x1=15.0;y1=6.0;printf(x=%d,y=%dn,x,y);printf(x+y=%dn,x+y); printf(xy=%dn,x-y);printf(x*

24、y=%dn,x*y);printf(x/y=%d.%dn,x/y,x%y);printf(x1/y1=%fn,x1/y1);运行结果为:运行结果为:x=15,y=6x+y=21xy=9x*y=90x/y=2.3x1/y1=2.500000华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计【说明】:在数学中恒等的表达式,在C 语言表达式中不一定恒等,如: 6/4*56*5/ 4。建议:在“/”运算符两边采用float/double数据(精确精确除除) 下面的表达式隐含了危险,因为被0除: 18/(3/6) 18/

25、((double)3/6) 或者:“/”两边的整数有一个在数尾加小数点,如:18/(3./6)华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计在在C语言中,字符型、整型和浮点型数据可以语言中,字符型、整型和浮点型数据可以在同一表达式中混合使用,在同一表达式中混合使用,C语言编译系统会按照语言编译系统会按照一定的准则自动进行类型转换。当出现下列三种情一定的准则自动进行类型转换。当出现下列三种情况时发生自动类型转换:况时发生自动类型转换:(1)当双目运算符的两个运算量结果的类型不相同当双目运算符的两个运算量结果的

26、类型不相同(2)且进行算术运算时;且进行算术运算时;(2)当一个值赋予一个不同类型的变量时;当一个值赋予一个不同类型的变量时;(3)函数调用函数调用,实参与形参类型不同时。实参与形参类型不同时。在本节中仅介绍前两种转换,在本节中仅介绍前两种转换,函数调用转换将在本函数调用转换将在本书的后面部分介绍到。书的后面部分介绍到。华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计1.算术运算时的自动类型转换算术运算时的自动类型转换 它的基本规则可描述为:双目运算符的两个运它的基本规则可描述为:双目运算符的两个运算量中,值

27、域较窄的类型向值域较宽的类型转换。算量中,值域较窄的类型向值域较宽的类型转换。“值域值域”就是类型所能表示的值的最大范围。算术就是类型所能表示的值的最大范围。算术转转换遵循的转换方向如下图所示换遵循的转换方向如下图所示:华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计同时要注意几点:(1)表达式中的有符号和无符号字符以及短整型一律被转换为整型,如果int类型能表示原来类型的值,则转换成int类型,否则转换成unsigned类型。(2) 当算术运算中出现float类型时,首先将float转成double类型。华

28、中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计例如:float f = 3.6;int n = 6;long k = 21;double ss = f * n + k / 2; double double long double double 华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计2.赋值运算时的自动类型转换赋值运算时的自动类型转换赋值转换将右值表达式结果的类型转成左值表达式赋值转换将右值表达式结果的类型转成左值表

29、达式的数据类型。赋值转换具有强制性的数据类型。赋值转换具有强制性(隐式),(隐式),它不它不受算术转换规则的约束,转换结果的类型完全由左受算术转换规则的约束,转换结果的类型完全由左值表达式的类型决定。值表达式的类型决定。例如:例如:inti,j;floatm;i=m*j;周一12类型转换过程为:赋值运算符右类型转换过程为:赋值运算符右侧的表达式的值为侧的表达式的值为float/double类类型,经过赋值转换变成型,经过赋值转换变成int类型,类型,所以赋值表达式的值为所以赋值表达式的值为int类型。类型。华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语

30、言程序设计语言程序设计语言程序设计语言程序设计3.强制类型转换强制类型转换(显式)(显式) 强制类型转换是靠强制类型转换运算符来实现数据类型转换的,因此强制类型转换也叫做显式转换 。 强制类型转换表达式形式为:(类型名类型名)(表达式)(表达式)作用是将表达式结果类型转换成“类型名”所指定的类型。华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计例如例如:floatm,n(int)m将变量将变量m的的值的类型值的类型转换成转换成int类型类型,表达表达式的值为式的值为int类型。类型。(int)m+n表达式的结

31、果为表达式的结果为double类型类型需要注意的是需要注意的是,无论是自动类型转换还是强制类,无论是自动类型转换还是强制类型转换,都只是将变量或常量的值的类型进行暂时型转换,都只是将变量或常量的值的类型进行暂时的转换,用于参与运算和操作,的转换,用于参与运算和操作,而变量和常量本身而变量和常量本身的类型和数值并没有改变的类型和数值并没有改变。 华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计2.3.3关系运算符与关系表达式关系运算符与关系表达式C语言中的关系运算符包括:语言中的关系运算符包括:(小于小于)=(

32、大于或等于大于或等于)(大于大于)!=(不等于不等于)关系运算符都是双目运算符,它用来比较两个运算量之间的关系运算符都是双目运算符,它用来比较两个运算量之间的关系。用关系运算符将前、后两个运算量连接起来的式子称为关系。用关系运算符将前、后两个运算量连接起来的式子称为“关系表达式关系表达式”,这,这两个运算量可以是任意表达式两个运算量可以是任意表达式。当关系表。当关系表达式成立时,表达式的结果为整数达式成立时,表达式的结果为整数1,否则为整数,否则为整数0。华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计例2.

33、5 关系表达式的值#include void main( ) char ch1,ch2; ch1 = a; ch2 = b; printf(%c = %c-%dn,ch1,ch2,ch1 = ch2); printf(%c %c-%dn,ch1,ch2,ch1 %c-%dn,ch1,ch2,ch1 ch2); printf(%c = %c-%dn,ch1,ch2,ch1 = %c-%dn,ch1,ch2,ch1 = ch2); printf(%c != %c-%dn,ch1,ch2,ch1 != ch2);运行结果为:a = b-0a b-0a = b-0a != b-1华中科技大学信息学院华

34、中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计 优先级优先级 、 = = 、 ! = 关系运算符与算术运算符和赋值运算符比较优先级算术运算符关系运算符高低高低关系运算符的结合性左结合性 【例】 a=3,b=2,c=1;求:a b c 的值 第一步:32关系成立,结果为1;第二步:11关系不成立,结果为0。华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计C语言中的语言中的逻辑运算符逻辑运算符包括:包括:&(逻辑与逻辑与)|(逻辑或逻辑或)!(逻辑

35、非逻辑非)其中,逻辑与和逻辑或是双目运算符,逻辑其中,逻辑与和逻辑或是双目运算符,逻辑非是单目运算符。逻辑运算符及运算量按一非是单目运算符。逻辑运算符及运算量按一定规则所构成的表达式称为定规则所构成的表达式称为逻辑表达式逻辑表达式。 2.3.4逻辑运算符与逻辑表达式逻辑运算符与逻辑表达式华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计C的语法将参与逻辑运算的两个运算分量解释为逻辑量,的语法将参与逻辑运算的两个运算分量解释为逻辑量,但通常逻辑运算符两边的运算分量可以是一般表达式。因此,但通常逻辑运算符两边的运算

36、分量可以是一般表达式。因此,就需就需先将这些表达式的结果数值转换为逻辑值先将这些表达式的结果数值转换为逻辑值“真真”或或“假假”,再来进行逻辑比较,再来进行逻辑比较。 逻辑运算分量对应的表达式转换为逻辑量的规则:逻辑运算分量对应的表达式转换为逻辑量的规则:若运算分量的值为若运算分量的值为非非0的任意数的任意数,则为逻辑,则为逻辑“真真”;若运算分量的值为若运算分量的值为0,则为逻辑,则为逻辑“假假”;华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计逻辑运算符的运算规则见下表逻辑运算符的运算规则见下表:表达式表

37、达式X表达式表达式Y!X!YX&YX|Y非0非0 0 0 11非00 0 1 01 非0 非0 1 0 1100 1 1 11华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计例例2.6逻辑运算符逻辑运算符&的使用的使用#includevoidmain()inta,b,c,max;a=10;b=20;max=b;c=(ab)&(max=a);printf(a=%d,b=%d,c=%d,max=%dn,a,b,c,max);运行结果为:运行结果为:a=10,b=20,c=0,max=20华中科技大学信息学院华中科

38、技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计 在数学中经常有右边的表达式:1=x=1),在Pascal 语言中是用逻辑运算符将两个关系表达式连接起来表示,x=1 and x=1 & x=h,直接写成直接写成1=x=h,结果如何?,结果如何?对对C来说是符合语法的来说是符合语法的,因为它是一个关系表达式,按左结合求解1=x,若x取值满足条件则表达式结果为1,然后1h时前面的关系表达式结果也为 “真”。显然,这种书写方式不能起到对应的条件限制作用。华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语

39、言程序设计语言程序设计语言程序设计语言程序设计例: 判断某个字符C 是否为数字字符,正确的写法:if (c=0 & c=9) 若写成:if ( 0=c=9 ) 则当C 为ASCII码大于57的其它字符(如a、A、)都可以使表达式为“真”。华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计【经典示例】 d !=0 & n /d 0 (假设初始值:d=0)由于d !=0 关系不成立,逻辑量为“假”,因为逻辑“与”运算等效于乘法,即只要两个运算分量中有一个为逻辑“假” ,则整个逻辑“与”运算就为“假”。 故而,本例中

40、n/d0将不被运算!从而避免被0除,增加程序的健壮性!逻辑运算符的优化算法 编译程序在处理含有&和|的表达式时,往往采用优化算优化算法法,有的书上称之为“短路器”,即自左而右一旦能确定结果的真假,则求值的计算立即结束,也就是说,并不是表达式中的所有逻辑运算符都被执行,或者说,不是所有的逻辑运算分量都被计算。华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计void main ( ) int a , b , c ; a = b = c =1 ; printf (“ (1) %d n ” , +a | | + b

41、&+c ) ; printf (“ (2) %d t %d t %d n ” , a , b , c ) ; printf (“ (3) %d n ” , +a & + b | |+c ) ; printf (“ (4) %d t %d t %d n ” , a , b , c ) ; printf (“ (5) %d n ” , a | | b | | c ) ; printf (“ (6) %d t %d t %d n ” , a , b , c ) ; printf (“ (7) %d n ” , a & b & c ) ; printf (“ (8) %d t %d t %d n ”

42、, a , b , c ) ; printf (“ (9) %d n ” , a | | b & c ) ; printf (“ (10) %d t %d t %d n ” , a , b , c ) ;结果输出:1211()()()1321122101100000华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计自增、自减运算符分别为自增、自减运算符分别为:+(自增自增)-(自减自减)+和和-分别都有两种不同的形式:分别都有两种不同的形式:前置式:前置式:+i、-i后置式:后置式:i+、i-2.3.5自增和自

43、减运算自增和自减运算华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计(1)前置运算是变量先自增前置运算是变量先自增1或自减或自减1后后,再参与其他再参与其他的运算的运算,即即先变后用;引用的是新值先变后用;引用的是新值(2)例如例如:x=0;y=-x+x;结果为结果为x=-1,y=-2(2)后置运算是该变量先以原来的值参加其它运算,后置运算是该变量先以原来的值参加其它运算,然后再自增然后再自增1或自减或自减1,即即先用后变;引用的是旧值先用后变;引用的是旧值例如:例如:x=10;y=x+x;结果为结果为x=1

44、1,y=20;(3)自增自减运算符只能作用于变量,不能用于常量自增自减运算符只能作用于变量,不能用于常量和表达式以及函数调用和表达式以及函数调用。华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计例2.7 自增自减运算符的运算#includevoidmain()intx,y;x=0;y=10;/*变量变量x先输出值,再自增,变量先输出值,再自增,变量y先自增先自增,再输出值再输出值*/printf(x=%d,y=%dn,x+,-y);printf(x=%d,y=%dn,x,y);运行结果为:运行结果为:x=0,

45、y=9x=1,y=9华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计1.基本赋值运算基本赋值运算“”它的一般表达式形式为:它的一般表达式形式为:左值表达式左值表达式=右值表达式右值表达式赋值表达式的值 等于表达式左值变量的值例如例如:inti,jcharm,nfloatx,ydoublezj=ii=mz=x*i2.3.6赋值运算符与赋值表达式赋值运算符与赋值表达式i=mnmn的结果为整型,无的结果为整型,无需转换,直接将值赋给需转换,直接将值赋给ii=j=10(考虑结合性)(考虑结合性)相当于相当于i=(j=

46、10),先将先将10赋给赋给j,而括号中的赋值表达式而括号中的赋值表达式(j=10)的值就是赋值后的)的值就是赋值后的j的值的值,再将其赋给再将其赋给i(考虑类型转换)(考虑类型转换)(考虑优先级考虑优先级)华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计2.复合赋值运算复合赋值运算在赋值运算符在赋值运算符“=”前加上其他运算符,便构成了前加上其他运算符,便构成了复合赋值运算符。复合赋值运算符。C语言中的复合赋值运算符共有语言中的复合赋值运算符共有10种种:+=、-=、*=、/=、%=、&=、|=、=、=复合

47、赋值表达式的形式为:复合赋值表达式的形式为:左值表达式左值表达式op=右值表达式右值表达式例如:例如:i+=j等价于等价于i=i+jx*=y-5等价于等价于x=x*(y-5)m=2等价于等价于m=m b ) ? a : b ; 将a , b中最大的数赋值给变量 maxmin = ( a = ? c : ? ) ; printf ( “% c” , c = ? c : ? ) ;c =a b ?a : b*b ; c =(a b) ?a :( b*b );()优先级:关系运算符高逻辑运算符?:条件运算符赋值运算符低华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C

48、 C语言程序设计语言程序设计语言程序设计语言程序设计结合性右结合性a b ? a : c d ? c :d(a b)? a :(c d)? c:d)若:a =1 , b = 2 , c = 3 , d = 4 ,则表达式值 = 4。表达式2和表达式3可以不同类型,此时条件表达式的值的类型为二者中较高的类型,如: xy?1:1.5,若xy关系成立,则表达式结果为1. 0 ( double类型 )。华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计例例2.8条件运算符的使用条件运算符的使用#includevoidm

49、ain()inta,b,c;a=10;b=-5;c=b0?a+b:a-b;/*当当b0时,时,c的值等于的值等于a+b;当;当b0时,时,c的值等于的值等于a-b*/printf(a=%d,b=%d,a+|b|=%dn,a,b,c);运行结果为:运行结果为:a=10,b=-5,a+|b|=15华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计附:在C+中有下面一条语法规则:在一个条件运算符的表达式中,如果后面两个表达式的值类型相同,而且均可以作为左值,则该条件运算符的值是一个左值表达式。如: intx=5;lo

50、nga,b;(x?a:b)=1;/ 注:若注:若x为真,则为真,则a变量的值将被变量的值将被赋值为赋值为1(x?x:b)=2;/ x和 b 不是相同类型,条件运算符将作自动转换,经过转换类型的表达式不能再作为左值。(x?a:6.6)=3;/6.6不是左值第一表达式可以为非左值的表达式,如:(x= =0?a:b) = 8;华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计逗号运算符构成逗号表达式,结构为:逗号运算符构成逗号表达式,结构为:表达式表达式1,表达式表达式2,表达式表达式3,表达式表达式n运算过程为:先

51、求表达式运算过程为:先求表达式1的值,然后再求表达式的值,然后再求表达式2的值,依次计算下的值,依次计算下去,最后表达式去,最后表达式n的值也就是该逗号表达式的值。的值也就是该逗号表达式的值。例如例如:intb,a=10;/分隔符分隔符b=a+,a%3/逗号运算符逗号运算符(顺序计算运算符)(顺序计算运算符)先求表达式先求表达式1的值,结果为的值,结果为10,同时对,同时对a计算后缀计算后缀+,此时,此时a的值为的值为11;然后求表达式然后求表达式2(a%3)的值,由于在计算表达式的值,由于在计算表达式2之前,变量之前,变量a的自增的自增运算已经完成,因而表达式运算已经完成,因而表达式2的值为

52、的值为2。这样整个逗号表达式的值为。这样整个逗号表达式的值为2。2.3.8逗号运算符与逗号表达式逗号运算符与逗号表达式华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计sizeof运算符运算符1、格式:、格式:sizeof(类型名类型名)2、含义:含义:求某种数据类型的变量存储空间的长度(以字节为单位)。求某种数据类型的变量存储空间的长度(以字节为单位)。该运算符是在该运算符是在编译时执行编译时执行,而不是在程序执行时进行运算。,而不是在程序执行时进行运算。3、应用、应用类型名可以是类型名可以是C语言的基本数据

53、类型或者构造数据类型语言的基本数据类型或者构造数据类型(如:数组、指针、结构等),(如:数组、指针、结构等),如:如: sizeof(structstudent)intarray7;sizeof(array)sizeof(int);sizeof(int*)华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计2.4位运算位运算2.4.1 按位与运算符“&”2.4.2 按位或运算符“|”2.4.3 按位异或运算符“” 2.4.4 二进制左移运算符“”2.4.6 按位取反运算符“”华中科技大学信息学院华中科技大学信息学

54、院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计2.4.1按位与运算符按位与运算符“&”按位与按位与运算是对两个操作数逐位求运算是对两个操作数逐位求与与,当它们都为当它们都为1时时,结果为结果为1,否则为否则为0。与运算符的定义如下表所示。与运算符的定义如下表所示: 位1 位2 位1&位2 0 0 0 0 1 0 1 0 0 1 1 1例如例如:a=0x96,b=0x80,则则a&b的结果为的结果为0x80华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计运算过程

55、为:华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计按位按位“与与”的作用:的作用:(1)将某些位清零将某些位清零 在实际应用中通常遇到这样一种情况,根据特定的需要将某些数在实际应用中通常遇到这样一种情况,根据特定的需要将某些数字的某些二进制位清零,如要将某端口控制的某些发光二极管熄灭,实字的某些二进制位清零,如要将某端口控制的某些发光二极管熄灭,实际上是将某个控制数的对应位清零,如际上是将某个控制数的对应位清零,如a=0x55,要将要将a的低四位清零,那的低四位清零,那就要将就要将a与一个数进行按位与运算,

56、这个数的低四位为零其它位为与一个数进行按位与运算,这个数的低四位为零其它位为1。运算过程如下:运算过程如下:运算的结果是对象数据的低四位清运算的结果是对象数据的低四位清0,其它不变。,其它不变。华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计(2)取数中的特定位取数中的特定位 与上述操作相反,在实际操作中通常要求保持某些位的状与上述操作相反,在实际操作中通常要求保持某些位的状态,如态,如a=0x55,要保持要保持a的低四位,其它位清零,那就要将的低四位,其它位清零,那就要将a与一个与一个数进行按位与运算,这个

57、数的低四位为数进行按位与运算,这个数的低四位为1其它位为其它位为0。运算过程如下:运算过程如下:运算的结果是对象数据的低四位不变,其它清运算的结果是对象数据的低四位不变,其它清0华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计2.4.2按位或运算符按位或运算符“|”按位或按位或运算是对两个操作数逐位相运算是对两个操作数逐位相或或。当它们都是。当它们都是0的时候的时候,结果为结果为0,否则为否则为1。下表为位逻辑或操作的下表为位逻辑或操作的“真值表真值表” 位1 位2 位1|位2 0 0 0 0 1 1 1 0

58、 1 1 1 1华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计运算过程为运算过程为:例如例如:a=0x36,b=0x55,则则a | b的结果为的结果为0x77华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计按位按位“或或”的作用的作用(1)将数的某些位置将数的某些位置1在实际应用中有时也遇到这样一种情况,根据特定的需要将在实际应用中有时也遇到这样一种情况,根据特定的需要将某些数字的某些二进制位置某些数字的某些二进制位置1

59、,如要将某端口控制的某些发光二极,如要将某端口控制的某些发光二极管点亮,实际上是将某个控制数的对应位置管点亮,实际上是将某个控制数的对应位置1,如,如a=0x55,要将要将a的的低四位置低四位置1,那就要将,那就要将a与一个数进行按位或运算,这个数的低四与一个数进行按位或运算,这个数的低四位为位为1其它位为其它位为0。运算过程如下运算过程如下:运算的结果是对象数据的低四位置运算的结果是对象数据的低四位置1其它不变其它不变华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计(2)把一串二进制数连接到另一串二进制数后

60、把一串二进制数连接到另一串二进制数后 在实际应用中有时也需要将一串二进制数连接到另一串二进制数在实际应用中有时也需要将一串二进制数连接到另一串二进制数后,如通讯中的后,如通讯中的CRC校验就是这样,对于这样的问题一般是这样处理校验就是这样,对于这样的问题一般是这样处理的:先在对象字符串的末尾加上的:先在对象字符串的末尾加上N个零,个零,N为要连接的二进制串的位为要连接的二进制串的位数,然后进行按位或操作,得到的结果即为所求。如数,然后进行按位或操作,得到的结果即为所求。如a=0x55,要连接的数要连接的数据为据为8位二进制串,表示成十六进制为位二进制串,表示成十六进制为0xaa;则首先将则首先

61、将a的后面加的后面加8个个0(2);变变成成0x5500,然后与然后与0xaa按位或。按位或。 华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计2.4.3按位异或运算符按位异或运算符“”按位按位异或异或运算是将两个操作数逐位相异或运算是将两个操作数逐位相异或,当它们当它们一个为一个为1,一个为一个为0时时,其相异或的结果为其相异或的结果为1,否则为否则为0。下表为下表为 位逻辑异或操作的位逻辑异或操作的“真值表真值表” 位1 位2 位1位2 0 0 0 0 1 1 1 0 1 1 1 0华中科技大学信息学院华

62、中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计运算过程为运算过程为:从所得的结果看,某位要保持不变就异或从所得的结果看,某位要保持不变就异或0,某位要取反就异,某位要取反就异或或1。华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计2.4.4二进制左移运算符二进制左移运算符“”二进制左移运算符把数据向左移动若干位二进制左移运算符把数据向左移动若干位,移出左移出左边界的所有位都将丢失边界的所有位都将丢失,右侧新增加的位为右侧新增加的位为0。例如:例

63、如:inta=4,a”二进制右移运算符把数据向右移动若干位二进制右移运算符把数据向右移动若干位,移出右边界的所有移出右边界的所有位都将丢失位都将丢失,左侧的新位的补充遵循下面的规则:左侧的新位的补充遵循下面的规则:【例例】变量变量a是无符号数,是无符号数,a=8,其二进制表示为其二进制表示为00001000,右移右移1位且左侧新位补位且左侧新位补0后结果为后结果为00000100,所以所以a1的结果为的结果为4.由例子可知,由例子可知,向右移动一位相当于整除以一个向右移动一位相当于整除以一个21。a4的结果为的结果为0(1)对于无符号数对于无符号数,右移时左侧的新位一律补右移时左侧的新位一律补

64、0,称为称为“逻辑右移逻辑右移”(2)对于有符号数对于有符号数,若符号位是若符号位是0,则左侧新位一律补则左侧新位一律补0;若符号位是;若符号位是1,则左侧新位一律补则左侧新位一律补1,称为称为“算术右移算术右移”又叫又叫“符号位扩展符号位扩展”华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计【例例】变量变量a是有符号数,是有符号数,a=1,其二进制表示为:其二进制表示为:111111111右移右移1位且左侧新位补位且左侧新位补1后结果为后结果为111111111,所以所以a1的结果为的结果为1.?a2的结果

65、仍为的结果仍为1(unsigned)a1的结果为的结果为2147483647或或32767?华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计2.4.6按位取反运算符按位取反运算符“”按位取反运算符是将操作数进行逐位按位取反运算符是将操作数进行逐位“取反取反”。例如例如:变量变量a=0x6a,二进制表示为,二进制表示为01101010,按位取反后为按位取反后为10010101,所以,所以a的结果为的结果为0x95。华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计

66、语言程序设计语言程序设计语言程序设计2.5运算符的优先级和结合性运算符的优先级和结合性C语言将44个运算符分为15个优先级,1级最高,2级次之,以此类推,15级最低。优先级高的运算符先执行运算。运算符的结合性是指当一个运算对象两侧的运算符优先级相同时,进行运算处理的结合方向。结合方向分为:左结合、右结合。华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计2.7运算符的优先级和结合性总结运算符的优先级和结合性总结一、优先级优先级是用来确定运算的先后顺序,更具体地说,当某个运算分量的两边各有一个运算符时,此时该运算

67、分量将参与哪边运算符的运算就要考虑运算符的优先级,如: b+c * d中的c将和d一起参与乘法运算,然后中间结果与b一起参与加法运算。下面给出一些注释,它有助于掌握C 的运算符优先原则:华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计2.7运算符的优先级和结合性总结运算符的优先级和结合性总结3、基本运算符优先级最高,在任何情况下“()”最优先。1、所有运算符归纳为8层:基本运算符单目运算符算术运算符关系运算符逻辑运算符条件运算符赋值运算符逗号运算符;2、位运算符优先级容易混淆,通常使用括号。除了移位运算符外,

68、其它位运算符与逻辑运算符相邻,但比逻辑运算符优先级高,又比关系运算符低。4、单目运算符比二目、三目运算符优先级高。5、算术运算符优先级比关系运算符高。6、关系运算符优先级比逻辑运算符高。华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计7、条件运算符优先级高于赋值运算符。8、赋值运算符优先级低于除逗号运算符以外的所有运算符。9、逗号运算符优先级最低。基本运算符:( ) .单目运算符:! + - - + (类型) * & sizeof( )算术运算符: * / % + 移位运算符:关系运算符: = = !=位运算

69、符 :& |逻辑运算符:& | |条件运算符:?:赋值运算符:= += = *= /= %= = &= = |=高低华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计二、结合性 当运算分量两边的运算符是同优先级时,这时就要考虑处于同优先级的两个运算符的结合性了,即运算分量将同哪一边的运算符结合。 C 语言中同优先级的运算符结合性不外乎两种:左结合性、右结合性。绝大部分运算符是左结合性,只有赋值运算符、条件运算符和单目运算符为右结合性。如:x=y=0;z+=-x+y;z+=(-(x+)+y);华中科技大学信息学院

70、华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计例如:int x,y,zz= y“+”(加法运算符)“&”“=”。所以表达式的运算过程可以表示为:z=(ym,则,则m自动取自动取n值,即保证值,即保证n个字符正常输个字符正常输出。出。华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计例例字符串的输出。字符串的输出。voidmain()printf(%3s,%7.2s,%.4s,%-5.3sn,HUST,HUST,HUST,HUST);输出如下:输

71、出如下:HUST,HU,HUST,HUS其中第其中第3个输出项,格式说明为个输出项,格式说明为“%.4s”,即只指定,即只指定了了n,没指定,没指定m,自动使,自动使m=n=4,故占,故占4列。列。 华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计(3)浮点数浮点数%f,不指定字段宽度,由系统自动指定,不指定字段宽度,由系统自动指定,使整数部分全部如数输出,并输出使整数部分全部如数输出,并输出6位小数。位小数。应当注意,并非全部数字都是有效数字。应当注意,并非全部数字都是有效数字。单精度实数的有效位数一般为单

72、精度实数的有效位数一般为7位。位。%m.nf,指定输出的数据共占,指定输出的数据共占m列,其中有列,其中有n位小数。如果数值长度小于位小数。如果数值长度小于m,则左端补,则左端补空格。空格。%-m.nf,与与%m.nf基本相同,只是使输出的基本相同,只是使输出的数值向左端靠,右端补空格。数值向左端靠,右端补空格。华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计例例输出实数时指定小数位数。输出实数时指定小数位数。#includevoidmain()floatx=357.987;printf(%f,%10f,%1

73、0.2f,%.2f%-10.2fn,x,x,x,x,x);输出结果如下:输出结果如下:357.987000,357.987000,357.99,357.99,357.99华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计表表2.11 scanf格式字符格式字符格式字符格式字符说说明明d用来用来输输入有符号的十入有符号的十进进制整数制整数o用来用来输输入无符号的八入无符号的八进进制整数制整数x,X用来用来输输入无符号的十六入无符号的十六进进制整数(大小写制整数(大小写作用相同)作用相同)c用来用来输输入入单单个字

74、符个字符s用来用来输输入字符串,在入字符串,在输输入入时时以空白字符开以空白字符开始,以一个空白字符始,以一个空白字符结结束。束。f用来用来输输入入实实数,可以用小数形式或指数形数,可以用小数形式或指数形式式输输入入华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计表2.12 scanf的附加格式说明字符字符字符说说明明l用于用于输输入入长长整型数据(可用整型数据(可用%ld,%lo,%lx)以及以及double型数据型数据(可用可用lf)longdouble(%Lf)h用于用于输输入短整型数据(可用入短整型数

75、据(可用%hd,%ho,%hx)域域宽宽指定指定输输入数据所占入数据所占宽宽度(列数),域度(列数),域宽应为宽应为正整数正整数*表示本表示本输输入入项项在在读读入后不入后不赋给赋给相相应变应变量量华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计2.7常见问题分析常见问题分析1.数据的溢出问题数据的溢出问题数据有其固定的表示范围,因此当数据的值超出了其范围时,将出现溢出问题。例2.9 整型数溢出 #include void main( ) short a,b; a = 32767; b = a + 1; pr

76、intf(%d,%dn,a,b);在上面这段程序中,变量a的值为32767,它在内存中的表示为:a:0111 1111 1111 1111当a加上1后,内存中的表示为:1000 0000 0000 0000它的实际十进制值为 -32768,与我们希望的32768的值不符,这就是因为溢出问题而产生的错误,在程序编写过程中需要注意避免。华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计2.无符号整数与有符号整数的混合运算问题无符号整数与有符号整数的混合运算问题例例2.10无符号整型数与有符号整型数混合运算出错无符号

77、整型数与有符号整型数混合运算出错#includevoidmain()intx=1;unsignedinty=2;printf(x-y=%d,(x-y)/2=%dn,x-y,(x-y)/2);输出结果为:输出结果为:xy=-1,(x-y)/2=32767按照常理,我们认为按照常理,我们认为(1-2)/2结果应该为结果应该为-0.5,截去小数后,结果应为,截去小数后,结果应为0,但事实上并非如此,而是得到结果,但事实上并非如此,而是得到结果32767。分析如下分析如下:华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序

78、设计变量x,y的值分别为1和2,它在内存中的表示为:x: 0000 0000 0000 0001y: 0000 0000 0000 0010执行x y操作后,根据C语言中的类型自动转换原则,计算结果的类型应为符号整型数,其结果在内存中的存放形式为:x y: 1111 1111 1111 1111如果将x y的结果以有符号整型数形式输出,因x -y的最高位为1,输出结果为-1。如果将(x y)/2其结果在内存中的存放形式为:(x y)/2: 0111 1111 1111 1111以有符号数的形式输出,正好为32767。而不是我们按常理应得到的数字0。华中科技大学信息学院华中科技大学信息学院华中科

79、技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计3.浮点型变量的舍入误差问题浮点型变量的舍入误差问题例2.11 实型数据的舍入误差#include void main( ) float x , y; x = 1.0; y = x / 3 * 3; printf(x = %f , y = %f n, x , y);输出结果为:x = 1.000000 , y = 0.999999建议:如果在表达式中出现除法运算符“/”时,建议将“/”尽量往后放。在一定程度上可以提高计算结果的精度。华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息

80、学院C C语言程序设计语言程序设计语言程序设计语言程序设计4.书写标识符时,忽略了大小写字母的区别书写标识符时,忽略了大小写字母的区别例2.12 标识符大小写引起的问题#include void main( ) int a=5; printf(%d,A); 编译程序把a和A认为是两个不同的变量名,而显示出错信息。C认为大写字母和小写字母是两个不同的字符。习惯上,符号常量名用大写,变量名用小写表示,以增加可读性。 华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计5.忽略变量的类型,进行了不合法的运算忽略变量的类

81、型,进行了不合法的运算 #include void main() float x,y; printf(%d,x%y); 另注意另注意“残值残值”问题!问题!%是求余运算,得到x/y后的整余数。整型变量x和y可以进行求余运算,而实型变量则不允许进行“求余”运算。华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计6.将字符常量与字符串常量混淆将字符常量与字符串常量混淆char c; c=a; 在这里就混淆了字符常量与字符串常量,字符常量是由一对单引号括起来的单个字符,字符串常量是一对双引号括起来的字符序列。C规定以

82、“”作字符串结束标志,它是由系统自动加上的,所以字符串“a”实际上包含两个字符:a和0,而把它赋给一个字符变量是不行的。 华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计7.忽略了忽略了“=”与与“=”的区别的区别在许多高级语言中,用在许多高级语言中,用“=”符号符号作为关系运算符作为关系运算符“等于等于”。如在。如在Pascal和和Ada中,使用符号中,使用符号“:=”作为赋值运算符,符号作为赋值运算符,符号“=”作为作为比较运算符,程序中可以写比较运算符,程序中可以写if(a=4)then.但但C语言中,

83、语言中,“=”是赋值运算符,是赋值运算符,“=”是关系运算符。如下例,是关系运算符。如下例,该语句本意是要检查该语句本意是要检查a是否和是否和4相相等:等:if(a=4)a=b;而实际上是将而实际上是将4赋值给了赋值给了a,然后检,然后检查表达式的结果是否为查表达式的结果是否为0,这样,这样,最终的结果始终是把最终的结果始终是把b值赋给了值赋给了a。由于习惯问题,初学者往往会犯这由于习惯问题,初学者往往会犯这样的错误。样的错误。建议如果想用类似于建议如果想用类似于e1=e2的表达的表达式作为条件表达式时,应该显式地式作为条件表达式时,应该显式地进行比较。也就是说,下例进行比较。也就是说,下例if(x=y)fun();应该写作:应该写作:if(x=y)!=0)fun();这种写法使得代码一目了然。这种写法使得代码一目了然。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 资格认证/考试 > 自考

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号