《C语言程序设计第3章.ppt》由会员分享,可在线阅读,更多相关《C语言程序设计第3章.ppt(65页珍藏版)》请在三一办公上搜索。
1、第三章 数据类型、运算符与表达式,3.1 C语言的数据类型3.2 常量和变量3.3 整型数据3.4 实型数据3.5 字符型数据3.6 变量赋初值3.7 各类数值数据之间的混合运算3.8 算术运算符和算术表达式3.9 赋值运算符和赋值表达式3.10 逗号运算符和逗号表达式,3.1 C的数据类型,3.2 常量与变量,3.2.1常量和符号常量1.常量的概念常量:在程序运行过程中,其值不能被改变的量。2.常量的分类(1)整型常量(如12、0、-3为整型常量)(2)实型常量(4.6、-1.23为实型常量)(3)字符常量(a、d字符常量)(4)符号常量:用一个标识符代表的常量。1)符号常量定义格式#def
2、ine 常量符号名 常量 2)符号常量不同于变量,它的值在其作用 域内不能改变,也不能再被赋值;,例 3.1:#define PRICE 30main()int num,total;num10;total=num*PRICE;printf(“total=%d”,total);使用符号常量的好处:(1)含义清楚,见名知义,使用程序更加清楚易读;(2)在需要改变一个常量时能做到“一改全改”,便于程序的修改;,符号常量定义语句,PRICE符号定义后代表常量30,此句等同于Total=num*30,3.2.2变量,1.变量的概念:在程序运行时其值可以改变的量称为变量。2.变量的两个要素:(1)变量名。
3、每个变量都必须有一个名字变量名,变量命名遵循标识符命名规则。(2)变量值。在程序运行过程中,变量值存储在内存中。在程序中,通过变量名来引用变量的值。C语言中变量:“先定义,后使用”。也就是说,C要求对所有用到的变量做强制定义。,3,a,存储单元,变量值,变量名,变量值存取过程,变量名,根据变量名找到对应的存储单元,取出存储单元中存储的变量值,关于标识符(identifier)组成字符的规定:,(1)C语言规定标识符只能由字母、数字和下划线三种字符 组成,且第一个字符必须字母或下划线。例:合法的标识符:sum,average,_total,lotus_1_2_3,BASIC 不合法的标识符,¥1
4、23,#33,3D64,ab(2)C语言中,区分大小写字母,大写字母和小写字母被认 为是两个不同的字符。例:sum和SUM认为为不同的标识符。一般情况下,变量名采用小写字母表示。,(3)关于标识符长度的规定:Turbo C允许32个字符,有的系统如IBM PC和MS C取8个字符,如果变量名长度超过8个,只有前8个有效,后面的不被识别。例如:student_name和student_number被认为同一变量 注意:这种类型的错误,系统在编译时不会报错。(4)C语言的关键字不能用作变量名。标识符命名的良好习惯见名知意:所谓“见名知意”是指,通过变量名就知道变量值的含义。通常应选择能表示数据含义
5、的英文单词(或缩写)作变量名,或汉语拼音字头作变量名。例如,name/xm(姓名)、sex/xb(性别)、age/nl(年龄)、salary/gz(工资)。,3.3 整型数据,3.3.1整型常量的表示方法 整型常量的表示方法有三种:1)十进制整数。如123,-456,0;2)八进制整数。以0开头的数是八进制。如0123,-011;3)十六进制整数。以0 x开头的数是十六进制数。如 0 x123,-0 x18。整型变量 数据在内存中是以二进制形式存放的。微机上使用的C编译系统,每一个整型变量在内存中占用2个字节。例:int i;i=10;,i,实际使用中,整型变量的数值是以补码形式存放的。正数的
6、补码:正数的补码和其原码的形式相同。例:10 原码 补码负数的补码:绝对值的二进制形式,按位取反再加1-10 10的原码 取反 再加1得-10的补码,2.整型变量的分类,3.整型变量的定义,对于变量的定义,一般是放在一个函数的开头部分的声明部分(子函数放在子函数的声明部分)。例3.2整型变量的定义与使用main()int a,b,c,d;/*定义为整型变量*/unsigned u;/*指定u为无符号整型变量*/a=12;b=-24;u=10;c=a+u;d=b+u;printf(“a+u=%d,b+u=%dn”,c,d);注:不同种类的整型数据可以进行算术运算。,4.整型数据的溢出,例3.3整
7、型数据的溢出main()int a,b;a=32767;b=a+1;printf(“%d,%d”,a,b);a:32767 b:-32768,结果为:32767,-32768,C的数据类型,复习内容,整型常量,八进制与十六进制常数八进制数:以“0”开始(不是“O”)010和10大小不一样十六进制:以“0 x”或者“0X”开始的整型常数 AF和af表示十进制的1015 0 x11,0 x05,0 xFA,0 xFF0f1,017,0 xFB,0 x8F,12456,018,复习内容,标识符,用户自定义的符号叫标识符 如变量名、函数名标识符由字母、数字和下划线组成,大小写敏感不可以是数字开头标识符
8、要直观,能表达它的功能关键字(keyword)不可作为标识符 int,float,for,while,if等 sum,3D64,_total,double,#33,a-b _123,复习内容,整型变量的分类,signed 说明他们是有符号的整数(正整数、0和负整数)。缺省都是有符号的,所以这个修饰符常省略 unsigned 说明他们是无符号的整数(正整数和0),复习内容,整型变量的分类,int 整数,在目前绝大多数机器上占2个字节-short int,短整数,一般占2字节。通常简写为shortlong int,长整数,一般占4字节。通常简写为long,复习内容,整型变量的分类,复习内容,3.4
9、实型数据,3.4.1实型常量的表示方法 实数(real number)又称浮点数(floating-point number).实数有两种表示形式:(1)十进制小数形式。它由数字和小数点组成。例如 123.45 0.345.345 0.0 0.0(2)指数形式。例:123e4或123E4表示123104。注意:1)E前面必须有数字,后面的必须为整数;2)规范化表示形式:字母e之前的小数部分中,小 数点前面应有且只能有一位非零的数字;例如:2.3478e12 3.099e23 为规范化表示形式 12.908e10 756e2 0.12e3 为非规范化表示,.3e3 3e3 3.e3 3e e3
10、3e0.3,3.4.2实型变量,1.实型数据的存放形式:一个实型数据一般在内存中占4个字节(32位)。按照指数形式存储。一般情况下,小数部分占用24位(包括符号位)。指数部分占用8位,采用规范化的指数形式。例如:3.14159在内存中的存放形式。,符号,小数部分.314159,指数部分101,2.实型变量的分类 C实型变量分为单精度(float型)、双精度(double型)和长双精度型(long double型)三类。,float x,y;,3.实型数据的舍入误差 实型变量是由有限的存储单元组成的,因此能提供的有效数字总是有限的,在有效位以外的数字将被舍去。由此可能会产生一些误差。例3.4ma
11、in()float a,b;a=123456.789e5;b=a+20;printf(“%f”,b);,理论答案是:,实际答案是:,3.4.3实型常量的类型,通常的C编译系统将实型常量作为双精度来处理。例:一个实型变量f,令:f=2.45678*4523.65 系统首先会把2.45678和4523.65按双精度处理,各 占64位,运算后得到一个双精度的乘积,然后取前7 位赋值给实型变量f.优点:精度高,计算结果更精确;缺点:运算速度降低。解决方法;在数的后面加字母f或F,系统会按单精度处理。1.62f 654.87f,3.5字符型数据,3.5.1字符常量 C的字符常量使用单引号括起来的一个字符
12、。如:a b D$?转义字符:,This is a c program!,例3.5转义字符的使用main()printf(“ab ct derftgn”);printf(“htibbj k”);,a,b,c,d,e,f,g,h,i,j,k,3.5.2字符变量,字符变量的定义形式:char c1,c2;说明;1)字符变量只能存放一个字符,每个变量在内存 中只占用一个字节的宽度;2)上述定义式把c1,c2定义为字符型变量,各可以 存放一个字符;例:c1=a;c2=b;c1=ab,3.5.3字符数据在内存中的存储形式及其使用方法,一个字符常量放到一个字符变量中,实际并不是把该字符本身放到内存单元中,
13、而是将该字符的ASCII代码放到存储单元中。例:c1=a实际作用是在变量c1所占用的内存单元中存 放了二进制码01100001;,c1,c1=a,01100001,1)字符数据与整数的存储形式类似,使得字符型数据和整型数据之间可以通用;2)大小写字母之间转换方便;,例3.6向字符变量赋以整数main()char c1,c2;c1=97;c2=98;printf(“%c%cn”,c1,c2);printf(“%d%dn”,c1,c2);,a b,97 98,向字符变量c1,c2赋以整数97,98,由此可见,字符型数据和整型数据是通用的。,注意:字符数据只占一个字节,它只能存放0127范围内的整数
14、,例3.7大小写字母的转换main()char c1,c2;c1=a;c2=b;c1=c1-32;c2=c2-32;printf(“%c%c”,c1,c2);,运行结果:A B,a的ASCII码为97,A为65。b的ASCII码为98,B为66。,这是C语言中字母实现大小转换的方法。使用相当方便。,3.5.4字符串常量,字符串常量:字符串常量是一对双引号括起来的字符序列。例如:“Hello Visual C#”,“China is the greatest country”字符串常量的存储形式:字符串各字符的ASCII码加上结束字符0。例如:“Hello Visual C#”,“a”,注意字符
15、常量a和字符串常量“a”是不相同的,a存储单元中没有“0”。因此切近字符常量和字符串常量混用,3.4 实型数据,实型常量的表示方法,两种表示形式,小数指数,0.123124e3,注意:字母e(或E)之前必须有数字,且e后面的指数必须为整数,1e3、1.8e-3、-123e-6e3、.e3、e,复习内容,3.4 实型数据,规范化的指数形式:在字母e(或E)之前的小数部分中,小数点左边应有一位(且只能有一位)非零的数字.例如:123.456可以表示为:123.456e0,12.3456e1,1.23456e2,0.123456e3,0.0123456e4,0.00123456e 其中的1.2345
16、6e3称为“规范化的指数形式”。,2.实型变量的分类 C实型变量分为单精度(float型)、双精度(double型)和长双精度型(long double型)三类。,float x,y;,复习内容,3.5 字符型数据,3.5.1 字符常量(1)用单引号包含的一个字符是字符型常量(2)只能包含一个字符,例,a,A,1abc、“a”,复习内容,3.5 字符型数据,有些以“”开头的特殊字符称为转义字符,n 换行t 横向跳格(水平制表符)r 回车 反斜杠ddd ddd表示1到3位八进制数字xhh hh表示1到2位十六进制数字,复习内容,字符变量字符型变量用来存放字符常量,注意只能放一个字符。字符变量的定
17、义形式如下:char c1,c2;在本函数中可以用下面语句对c1,c2赋值:c1a;c2 b;一个字符变量在内存中占一个字节。,c1,c1=a,01100001,复习内容,3.6变量赋初值,C语言允许在定义变量的同时使变量初始化。例:int a=3;/*指定a为整型变量,初值为3*/float b=3.56;/*指定b为实型变量,初值为3.56*/char c=a/*指定c为字符变量,初值为a*/也可以使被定义的变量的一部分赋初值。例:int a,b,c=5;如果对几个变量赋予同一个初值,可写成:int a,b,c;a=b=c=3;该式表示a,b,c的初值都是3,并不表示整个程序中a,b,c变
18、量一直相等的,只是初值相同。int a=b=c=3;是错误的。,初始化不是在编译阶段完成而是在程序运行时执行本函数时赋予初值,int a;,3.7各类数值型数据间的混合运算,不同类型的数据之间进行运算,级别低的向级别高的转换;转换不需要中间过程,直接转变为高级别数据类型;上述转换由系统自动进行。,例:i为整型变量,f为float变量,d为double型变量,e为long型。10+a+i*f-d/ea转整型,i、f转换为double型,e转换为double型。,如果一个运算符两侧的操作数的数据类型不同,则系统按“先转换、后运算”的原则,转换的方法有两种:自动转换(隐式转换);强制转换,3.8算术
19、运算符和算术表达式,C运算符简介1.算术运算符(+*/%)2.关系运算符(=|&)5.赋值运算符(=及其扩展赋值运算符)6.条件运算符(?:)7.逗号运算符(,)8.指针运算符(*&)9.求字节数运算符(sizeof)10.强制类型转换运算符(类型)11.分量运算符(.)12.下标运算符()13.其他(如函数调用运算符),3.8.2算术运算符和算术表达式,1.基本的算术运算符(加法运算符,或正值运算符。如3+5、3)(减法运算符,或负值运算符。如52、3)*(乘法运算符。如3*5)/(除法运算符。如5/3)%(模运算符,或称求余运算符,%两侧均应为整型数据,如7%4为3),说明:两个整数相除的
20、结果为整数,如5/3的结果值为1,舍去小数部分。一般情况下,采用“向零取整”的方法即5/3=1,5/3=1。,如果参加+*/运算的两个数中为实数,则结果为double型,2.算术表达式和运算符的优先级与结合性算术表达式:用算术运算符和括号将运算对象连接起来的符合C语言规则的式子,其计算符合运算符优先级和结合性的原则。运算符的优先级:P365附录C,C语言规定了运算符的优先级和结合性。1)在表达式求值时,先按运算符的优先级别高低次序执行;2)如果在一个运算对象两侧的运算符的优先级别相同,则按规定的结合方向处理;3)C规定了各种运算符的结合方向(结合性),算术运算符的结合方向为“自左至右”,又称“
21、左结合”。有些运算符的结合方向为“自右至左”,即右结合。例:a b+c b符号左边是减号,右边是加号,优先级相等,采用左结合,先a b,然后再c。,3.强制类型转换运算符一般形式:(类型符)(表达式)例:(double)a(将a转换成double类型)(int)(x+y)(将x+y的值转换成整型)(float)(5%3)(将5%3的值转换成float型),表达式应该用括号括起来。例如:(int)x+y,只强制转换的x的类型,而不是x+y的结果。,若有定义:int x=3,y=2;float a=2.5,b=3.5;则表达式(x+y)%2+(int)a/(int)b的值为。,例:(int)x 如
22、果x原指定为float型,进行强制类型运算后得到一个int型的中间变量,它的值等于x的整数部分,而x的类型不变,仍为float型。例3.8main()float x=3.6;int i;i=(int)x;printf(“x=%f,i=%d”,x,i);,注意:在强制类型转换时,得到一个所需类型的中间变量,原来变量的类型未发生变化。,最后结果:x=3.600000,i=3,4.自增、自减运算符作用:使变量的值增1或减1.例:+i,i(在使用i之前,先使i的值加(减)1)i+,i(在使用i之后,使i的值加(减)1)这两者有很大区别,一个是在使用之前加1,一个是 在使用之后加1;例:,j=3;k=+
23、j;j=3;k=j+;j=3;printf(“%d”,+j);j=3;printf(“%d”,j+);a=3;b=5;c=(+a)*b;a=3;b=5;c=(a+)*b;,k=4,j=4,k=3,j=4,4,3,c=20,a=4,c=15,a=4,注意:1)自增运算符(+)和自减运算符()只能用于变量,不能用于常量或表达式,如5+、(a+b)+皆不合法;2)和 的优先级高于算术运算符,结合方式是“自右至左”。例如:i+等同于(i+)i3 printf(“%d”,i+)结果为输出3,之后i的值变成4。,各类数值型数据间的混合运算,不同类型的数据之间进行运算,级别低的向级别高的转换;转换不需要中间
24、过程,直接转变为高级别数据类型;上述转换由系统自动进行。,如果一个运算符两侧的操作数的数据类型不同,则系统按“先转换、后运算”的原则,转换的方法有两种:自动转换(隐式转换);强制转换,复习内容,算术运算符和算术表达式,1.基本的算术运算符(加法运算符,或正值运算符。如3+5、3)(减法运算符,或负值运算符。如52、3)*(乘法运算符。如3*5)/(除法运算符。如5/3)%(模运算符,或称求余运算符,%两侧均应为整型数据,如7%4为3),说明:两个整数相除的结果为整数,如5/3的结果值为1,舍去小数部分。一般情况下,采用“向零取整”的方法即5/3=1,5/3=1。,如果参加+*/运算的两个数中为
25、实数,则结果为double型,各类数值型数据间的混合运算,强制类型转换运算符 可以利用强制类型转换运算符将一个表达式转换成所需类型。一般形式:(类型名)(表达式)例如:(double)将转换成double类型(int)(x+y)将x+y的值转换成整型(float)(5%3)将5%3的值转换成float型,复习内容,例题:,x+a%3*(int)(x+y)%2/4(设x=2.5,a=7,y=4.7),解:x+a%3*(int)(x+y)%2/4 x+a%3*(int)(7.2)%2/4,x+a%3*7%2/4,x+7%3*7%2/4,x+1*7%2/4,x+1/4,2.5+0 2.5,“()”运
26、算符优先级最高,%,*,/运算符优先级相同,遵循从左至右的结合顺序,“(int)”运算符优先级高于=,-,*%,复习内容,自增、自减运算符,+i,-i,i+,i-+让参与运算的变量加1,-让参与运算的变量减1+i,-i(运算符为前缀)先加/减1,再使用 i+,i-(运算符为后缀)先使用,再加/减1例如:j=+i;i的值先变成4,再赋给,j的值均为 j=i+;先将 i的值3赋给,的值为,然后变为,注意:(1)自增运算符(),自减运算符(),只能用于变量,而不能用于常量或表达式,(2)和的结合方向是“自右至左”。,复习内容,自增、自减运算符,以下程序的输出结果是()。#includemain()i
27、nt a=010,b=10;printf(“%d,%dn”,a+,-b);A)10,10B)8,10C)10,9D)8,9,D,复习内容,3.9赋值运算符和赋值表达式,1.赋值运算符 变量=表达式 赋值符号“”就是赋值运算符,它的作用是将一个表达式的值(常量和变量是表达式的特例)赋给一个变量。如:a=3;ave=(a+b)/102.类型转换 如果赋值运算符两侧的类型不一致,但都是数值型或字符型时,在赋值时要进行类型转换。,2.类型转换,(1)将实型数据(单、双精度)赋给整型变量时,舍弃实数的小数部分。例如:i为整型,i=3.16的结果为i=3;(2)将整型数据赋给单、双精度变量时,数值不变,但
28、以浮点数形式存储到变量中;f为float型,f=3的结果为i=3.000000;main()int i;float f;i=5.34;f=23;printf(“%d,%fn”,i,f);5,23.00000,(3)将一个double型数据赋给float变量,截取其前面7位有效数字,存放到float变量的存储单元(32位),需要注意不要超范围;将一个float型数据赋给double变量时,数值不变,有效位数扩展到16位,以64位存储,如:float f;double d=123.456789e100;f=d;就出现溢出的错误,2.类型转换,(4)字符型数据赋给整型变量时,由于字符只占1个字节,而
29、整型变量为2个字节,因此将字符数据(8位)放到整型变量低8位中。在Turbo C中,若字符的最高位为0,则整型变量最高8位补0;若最高位为1,则高8位补1.这称之为“符号扩展”。,c=376,i:,2.类型转换,c=53,i:,实际使用中,整型变量的数值是以补码形式存放的。正数的补码:正数的补码和其原码的形式相同。例:10 原码 补码负数的补码:绝对值的二进制形式,按位取反再加1-10 10的原码 取反 再加1得-10的补码,(5)将一个int、short、long型数据赋给一个char型变量时,只将低8位原封不动地送到char型变量(即截断),int i=289,char c;c=i,2.类
30、型转换,(6)将一个long型数据赋给一个int型变量,只将long型数据中低16位原封不动送到整型变量(即截断)。(7)将unsigned int型数据赋给long int型变量,不存在符号扩展问题,只需将高位补0即可。将一个unsigned类型数据赋给一个占字节数相同的整型变量,将unsigned型变量的内容原样送到非unsigned型变量中,但如果数据范围超过相应的整型范围,则会出现数据错误;,(8)将非unsigned型数据赋给长度相同的unsigned型变量,也是数值位连同符号位原样传送。例:main()unsigned a;int b=-1;a=b;printf(“%u”,a);,
31、b的补码,a原(补)码,运行结果:65535,不同类型的整型数据间的赋值归根到底就是一条:按存储单元中的存储形式直接传送。,所以:大家一定要好好熟悉原码,补码的概念。,最后各位记住:不同数据类型之间的赋值出错,C语言的编译系统并不会提示出错。,3.复合运算符 在赋值符“”之前加上其他运算符,可以构成复合运算符。例如:a+=3(相当于a=a+3),x*=y+8(相当于x=x*(y+8),x%=3(相当于x=x%3)a+=3 a+=3(将有下划线的“a+”移到“=”右侧)|_ a=a+3(在“=”左侧补上变量名a)a=12,计算a+=a a*=1+24.赋值表达式一般形式:作用:将赋值运算符右侧的
32、“表达式”的值赋给左侧的变量。结合顺序:“自右而左”,例1:a=b=c=5 a=(b=5)a=5+(c=6)a=(b=4)+(c=6),表达式值为5,a,b,c值为5,b=5;a=5,表达式值11,c=6,a=11,表达式值10,a=10,b=4,c=6,例2:a+=a=a*a(设a=12)1)首先遇到左侧的第一个“”运算符,根据“自右而左”,先计算a=a*a;它相当与a=aa*a 等于132;2)然后计算a=a+(132),注意这时a=132,最后结果是 264。a=a+(a-a*a),3.10逗号运算符和逗号表达式,逗号表达式的一般形式:表达式1,表达式2求解表达式的求解过程:先求解表达式
33、1,再求解表达式2,整个逗号表达式的值就是表达式2的值。注意:逗号运算符是所有运算符中级别最低的。例:a=3*5,a*4 1)根据运算符优先级(赋值运算符优先级高于逗号运算符),先计算a=3*5,结果为a=15;2)第二步,计算a*4,结果为60;3)整个表达式的值为60。,一个逗号表达式又可以与另一个表达式组成一个新的逗号表达式例:(a=3*5,a*4),a+5。1)求解a=3*5,得a=15;2)求a*4=60;3)求解a+5=20,所以逗号表达式的值为20一般表示式的扩展:表达式1,表达式2,表达式3,表达式n注意事项 1)并不是任何地方出现的逗号都是作为逗号运算符,例如:printf(“%d,%d,%d”,a,b,c);2)表达式1,表达式2,表达式n,逐个求解,不能直接求解表达式n,例:a=(3+5,3*5,5/3)a=3+5,3*5,5/3 i=3,i+,+i,i+5,a=1,表达式的值为1,a=8,表达式的值为1,表达式的值为10,