《c程序设计第三章.pptx》由会员分享,可在线阅读,更多相关《c程序设计第三章.pptx(42页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、(一)数据类型概述(一)数据类型概述(二)常量与变量(二)常量与变量(三)整型数据(三)整型数据(四)实型数据(四)实型数据(五)字符型数据(五)字符型数据(六)各类数值型数据间的混合运算(六)各类数值型数据间的混合运算返回返回C的数据类型第1页/共42页(一)C C的数据类型C C 语言的数据结构是以数据类型形式出现的。语言的数据结构是以数据类型形式出现的。C C的数据类型如下:的数据类型如下:数据类型基本类型整型字符型实型(浮点型)单精度型双精度型枚举类型构造类型数组类型结构体类型共用体类型指针类型空类型返回返回第2页/共42页(二)常量与变量1.常量和符号常量常量:在程序运行过程中,其值
2、不能被改变的量。常量区分为不同的类型:如:整型常量(12、-3)、实型常量(4.6、-1.23)、字符常量(a、d)。符号常量:用一个标识符代表一个常量,即标识符形式的常量。例 3.1 符号常量的使用。#define PRICE 30 main()int num,total;num=10;total=num*PRICE;printf(“total=%d”,total);第3页/共42页(1)程序中用#define命令行定义PRICE为30,此后凡在本文件中出现的PRICE都代表30,可以和常量一样进行运算。(2)符号常量不同于变量,它的值在其作用域内不能改变,也不能再被赋值。如在本例中再用以下
3、赋值语句给PRICE赋值是错误的:PRICE=40;(3)习惯上,符号常量名用大写,变量名用小写,以示区别。上述程序的说明如下:使用符号常量的好处:(1)含义清楚。如:sum=15*30*23.5*43;在检查程序时搞不清各个常数究竟代表什么。应尽量使用“见名知意”的变量名和符号常量。(2)在需要改变一个常量时能做到“一改全改”。如:#define PRICE 35在程序中所有以PRICE代表的价格就会一律自动全改为35。第4页/共42页2.变 量变量:其值可以改变的量。一个变量应该有一个名字,在内存中占据一定的存储单元。在该存储单元中存放变量的值。3变量值存储单元a变量名 见右图:变量名实际
4、上是一个符号地址,在对程序编译连接时由系统给每一个变量名分配一个内存地址。在程序中从变量中取值,实际上是通过变量名找到相应的内存地址,从其存储单元中读取数据。注:注:区分区分变量名变量名和和变量值变量值这两个不同的概念。这两个不同的概念。第5页/共42页3.标识符:用来标识变量名、符号常量名、函数名、数组名、类型名、文件名的有效字符序列称为标识符。C语言规定标识符只能由字母、数字和下划线三种字符组成,且第一个字符必须是字母或下划线。下面列出的是合法的标识符,也是合法的变量名:Sum,average,_total,tan,lotus_1,BASIC,li_ling不合法的标识符和变量名如右:M.
5、D.John,#33,3D64,ab(1)大写字母和小写字母被认为是两个不同的字符。(2)变量名的长度不要超过8个字符。Turbo C允许32个字符。(3)所有用到的变量名都要“先定义,后使用”,特别指出每一个变量各自属于什么类型。对于变量现说明如下:返回返回第6页/共42页(三)整型数据1.整型常量的表示方法整型常量即整常数。C整常数可用以下三种形式表示:(1)十进制整数。如123,-456,0。(2)八进制整数。以0开头的数是八进制数。如:0123表示八进制数123,即(123)8,其值为:182 28 1 380 ,等于十进制数83。(3)十六进制整数。以0 x或0X开头的数是十六进制数
6、。如:0 x123,代表十六进制数123第7页/共42页2.整型变量(1 1)整型数据在内存中的存放形式 数据在内存中是以二进制形式存放的。如果定义了一个整型变量i:int i;/*定义为整型变量*/i=10;/*给i 赋以整数10*/十进制数10的二进制形式为1010,在C编译系统中,每一个整型变量在内存中占2个字节。如下所示:i10(a)数据存放的示意图i0 0 0 0 0 0 0 00 0 0 0 1 0 1 0(b)数据在内存中实际存放的情况第8页/共42页实际上,数值是以补码(complementcomplement)表示的。一个正数的补码和其原码的形式相同。下图就是用补码形式表示的
7、。如果数值是负的,在内存中如何用补码形式表示呢?求负数补码的方法是:将该数的绝对值的二进制形式,按位取反再加1 1。例如:求-10的补码:10的原码0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 取反1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 1再加11 1 1 1 1 1 1 1 1 1 1 1 0 1 1 0得-10的补码第9页/共42页(2)整型变量的分类 可以根据数值的范围将变量定义为基本整型、短整型或长整型。因此有以下三类整型变量:基本整型,以int表示。短整型,以short int表示,或以short表示。长整型,以long int表示,或以long
8、表示。归纳起来,有以下6种整型变量。即:取值范围 字节数 有符号基本整型 signed int -3276832767 2 无符号基本整型 unsigned int 065535 2 有符号短整型 signed short int -3276832767 2 无符号短整型 unsigned short int 065535 2 有符号长整型 signed long int -21474836482147483647 4 无符号长整型 unsigned long int 04294967295 4第10页/共42页如果不指定unsigned或指定signed,则存储单元中最高位代表符号(0为正,
9、1为负)。如果指定unsigned,为无符号型,存储单元中全部二进制位(bit)用作存放数本身,而不包括符号。无符号型变量只能存放不带符号的整数,如123、4687等,而不能存放负数。如果在程序中定义a和b两个变量:int a;unsigned int b;则变量a的数值范围为-3276832767。而变量b的数值范围为065535。第11页/共42页(3)整型变量的定义对变量的定义,一般是放在一个函数的声明部分。例3.2:整型变量的定义与使用:main()int a,b,c,d;/*指定a、b、c、d为整型变量*/unsigned u;/*指定u为无符号整型变量*/a=12;b=-24;u=
10、10;c=a+u;d=b+u;printf(“a+u=%d,b+u=%dn”,c,d);运行结果为:a+u=22;b+u=-14可以看到不同种类的整型数据可以进行算术运算。第12页/共42页(4)整型数据的溢出 一个int型变量的最大值允许值为32767,如果再加1,会出现什么情况?例 3.3 整型数据的溢出。main ()int a,b;a=32767;b=a+1;运行结果为:32767,-32768 printf(“%d,%d”,a,b);0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 a:1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0b:32767-327
11、68从上图可以看到:变量a的最高为0,后15位全为1。加1后变成第1位为1,后面15位全为0。而它是-32768的补码形式,所以输出变量b的值为-32768。第13页/共42页注:一个int变量只能容纳-3276832767范围内的数,无法表示大于32767的数。遇此情况就发生“溢出”,但运行时并不报错。它好像汽车的里程表一样,达到最大值以后,又从最小值开始计数。所以,32767加1得不到32768,而得到 -32768,这与程序编制者的原意不同。因此,在操作时要特别注意,或将变量b改成long 型就可得到预期的结果32768。第14页/共42页3.整型常量的类型 我们已知整型变量可分为int
12、、short int、long int和unsigned int、unsigned short、unsigned long等类别。那么常量是否也有这些类别?在将一个整型常量赋值给上述几种类别的整型变量时如何做到类型匹配?请注意以下几点:(1)一个整数,如果其值在-3276832767范围内,认为它是int型,它可以赋值给int型和long int 型变量。(2)一个整数,如果其值超过了上述范围,而在-2147483648 2147483647范围内,则认为它是长整型,可以将它赋值给一个long int 型变量。(3)一个int 型的常量也同时是一个short int 型常量,可以赋给int 型
13、或short int 型变量。(4)一个整常量后面加一个字母u,认为是unsigned int 型,如12345u,在内存中按unsigned int规定的方式存放。(5)在一个整常量后面加一个字母l或L,则认为是long int 型变量。返回返回第15页/共42页(四)实型数据1.实型常量的表示方法实数(real number)又称浮点数(floating-point number)。实数有两种表示形式:(1)(1)十进制小数形式。它由数字和小数点组成(注意必须有小数点)。如:123.0 123.0、.123.123。(2)(2)指数形式。注意字母e e之前必须有数字,且e e后面的指数必须
14、为整数。如:123e3123e3代表12310123103 3 。“规范化的指数形式”:即在字母e e之前的小数部分,小数点左边应有一位(且只能有一位)非零的数字。一个实数在用指数形式输出时,是按规范化的指数形式输出的。第16页/共42页实型数据类型比特数有效数字数值范围floatdoublelong double3264128671516181910-38103810-3081030810-49321049322.实型变量如右图:实数3.141593.14159在内存中的存放形式。系统把一个实型数据分成小数部分和指数部分,分别存放。指数部分采用规范化的指数形式。数符小数部分指数部分.3141
15、59 101+.3 1 4 1 5 9 1+.3 1 4 1 5 9 1(1)实型数据在内存中的存放形式常用的微机系统中一个实型数据在内存占4个字节(32位)。与整型数据的存储方式不同,实型数据是按照指数形式存储的。(2 2)实型变量的分类 实型变量分为单精度(float(float型)、双精度(double(double型)和长双精度型(long double)(long double)三类。见下表:(3 3)实型数据的舍入误差 由于实型变量是用有限的存储单元存储的,因此能提供的有效数字总是有限的,在有效位以外的数字将被舍去。由此可能会产生一些误差。第17页/共42页许多C编译系统将实型常量
16、作为双精度来处理,可以将一个实型常量可以赋给一个float型、double型或long double变量。如:float a;a=111111.111;由于float型变量只能接收7位有效数字,因此后两位小数不起作用。若a改为double型,则能全部接收。若将实型常量赋给float型变量,其运算速度慢,为提高速度,可在常量后加上f或F。3.实型常量的类型返回返回第18页/共42页(五)字符型数据1.字符常量C的字符常量是用单引号括起来的一个单字符,如a。除了以上形式的字符常量外,还有一个以“”开头的特殊的字符常量(称为转义字符)。常见的有:字符形式含 义ASCII 码n换行,将当前位置移到下一
17、行开头tbr水平制表(跳到下一个Tab位置)退格,将当前位置移到前一列109813回车,将当前位置移到本行开头f换页,将当前位置移到下页开头反斜杠,字符“”单引号(撇号)字符”双引号字符ddd1到3位8进制数所代表的字符xhh1到2位16进制数所代表的字符12923934第19页/共42页注意:在显示屏上最后得到的结果与上述打印结果不同。例 3.4 转义字符的使用。main()printf(“ab c t de rftgn”);printf(“htibbj k”);程序运行时在打印机上得到以下结果:fab c gdeh jik第20页/共42页2.字符变量字符型变量用来存放字符常量。注:一个字
18、符变量只能放一个字符。一个字符变量在内存中占一个字节例如:char c1,c2;c1=a;c2=b;3.字符数据在内存中的存储形式及其使用方法 将一个字符常量放到一个字符变量中,实际上并不是把该字符本身放到内存单元中去,而是将该字符的相应的ASCII代码放到存储单元中。例如:字符a的ASCII代码为97,b为98,在内存中变量c1、c2的值,见右图(a)所示;实际上是以二进制形式存放的,见右图(b)所示。9798(a)c1c20110000101100010(b)第21页/共42页例 3.5 向字符变量赋以整数。main()char c1,c2;c 1=97;c 2=98;printf(“%c
19、%c n”,c1,c2);printf(“%d%d n”,c1,c2);程序运行的结果:a b 97 98可以看到:字符型数据和整型数据是通用的。它们既可以用字符形式输出(用%c),也可以用整数形式输出(%d)。注意:字符数据只占一个字节,它只能存放0 255范围内的一个整数。例 3.6 大小写字母的转换。main()char c1,c2;c1=a;c2=b;c1=c1-32;c2=c2-32;printf(“%c%c“,c1,c2);运行结果为:A B 该程序的作用:将两个小写字母a和b转换成大写字母A和B。(从ASCII代码表中可以看到一个小写字母比它相应的大写字母的ASCII码大32。)
20、注意:字符型数据与整型数据可以互相赋值。举例:第22页/共42页4.4.字符串常量字符常量是由一对单引号括起来的单个字符。而字符串常量是由一对双引号括起来的字符序列。如:“How do you do”,“CHINA”;都是字符串常量。可以输出一个字符串,如:printf(“How do you do”);注:不要将字符常量和字符串常量混淆。不要将字符常量和字符串常量混淆。a是字符常量,“a”是字符串常量,二者不同。例如设c为字符变量:char c;则:c=a;正确 c=“a”;错误 也就是说不能把一个字符串赋给一个字符变量。不能把一个字符串赋给一个字符变量。第23页/共42页C规定:在每一个字
21、符串的结尾加一个“字符串结束标志”,以便系统据此判断字符串是否结束。C规定以字符0作为字符串结束标志。如:“CHINA”,实际上是在内存中是:C H I N A 0它的长度不是5个字符,而是6个字符,最后一个字符为0。但在输出时不输出0。所以字符串“a”,实际上是包含2个字符:a和0,因此,把它赋给 只能容纳一个字符的字符变量c:c=“a”;显然是不行的。返回返回第24页/共42页(六)各类数值型数据间的混合运算整型和实型数据可以混合运算,字符型数据可以和整型通用,因此,整型、实型、字符型数据间可以混合运算。例如:10+a +1.5-8765.1234*b 是合法的。在进行运算时,不同类型的数
22、据要先转换成同一类型(系统自动完成,无需人工干预),按照下图进行运算:高 低intunsignedlongdoublefloatchar,short注意:箭头方向只表示数据类型级别的高低,由低向高转换。不要理解为int型先转换成unsigned int型,再转换成long型,再转成double型。上述的类型转换是由系统自动进行的。返回返回第25页/共42页运算符和表达式(一)C运算符简介(二)算术运算符和算术表达式(三)赋值运算符和赋值表达式(四)强制类型转换运算符(五)逗号运算符和逗号表达式返回返回第26页/共42页(一)C运算符简介:C的运算符有以下几类:1、算术运算符 8、指针运算符2、
23、关系运算符 9、求字节数运算符3、逻辑运算符 10、强制类型转换运算符4、位运算符 11、分量运算符5、赋值运算符 12、下标运算符6、条件运算符 13、其他7、逗号运算符返回返回第27页/共42页1、基本的算术运算符:(加法运算符,或正值运算符。如:3+5、+3)(减法运算符,或负值运算符。如:5-2、-3)*(乘法运算符。如:3*5)/(除法运算符。如:5/3)%(模运算符,或称求余运算符,%两侧均应为整型数据,如:7%4的值为3)需要说明的是:两个整数相除的结果为整数,但是,如果除数或被除数中有一个为负值,则舍入的方向是不固定的。多数机器采取“向零取整”的方法,如:-5/3=-1,取整后
24、向零靠拢。(二)算术运算符和算术表达式 第28页/共42页2、算术表达式和运算符的优先级与结合性算术表达式:用算术运算符和括号将运算对象(也称操作数)连接起来的、符合C语法规则的式子。运算对象包括常量、变量、函数等。例如,a-b*c 是一个合法的C算术表达式。C规定了各种运算符的优先级,上述表达式中,乘号优先于减号,因此,相当于a-(b*c)。如果在一个运算对象两侧的运算符的优先级别相同,如:a-b+c,则按规定的“结合方向”处理。C规定了各种运算符的结合方向(结合性),算术运算符的结合方向为“自左至右”,即先左后右,因此b先与减号结合,执行a-b的运算,再执行加c的运算。第29页/共42页3
25、、自增、自减运算符作用是使变量的值增1或减1。如:+i;-i;(在使用i之前,先使i的值加(减)1)i+;i-;(在使用i之后,使i的值加(减)1)如果i的原值等于3,则执行下面的赋值语句:(1)、j=+i;(i的值先变成4,再赋给j,j的值为4)(2)、j=i+;(先将i的值3赋给j,j的值为3,然后i变为4)注意:(1)自增运算符(+)和自减运算符(-),只能用于变量,而不能用于常量或表达式。如5+或(a+b)+都是不合法的。(2)+和-结合方向是“自右至左”。需知:符号运算符和“+”运算符同优先级,其结合方向也为“自右至左”。注:-(i+)是先用i的原值3加上负号输出-3,再对i加1,不
26、要认为先加完1后再加负号,输出-4,这是不对的。第30页/共42页如果i的原值等于3,则:(1)避免出现歧义。如:i+i+i+应该写成:i=3;a=i+;b=i+;c=i+;d=a+b+c;(2)不要写成:i+j,而应写成:(i+)+j的形式。(3)不要写成:printf(“%d,%d”,i,i+);其结果为:4,3而应写成:j=i+;printf(“%d,%d”,j,i)其结果为:3,44、有关表达式使用中的问题说明:返回返回第31页/共42页1、赋值运算符赋值运算符就是“=”,它的作用是将一个数据赋给一个变量。如:“a=3”的作用是执行一次赋值操作(或称赋值运算)。把常量3赋给变量a。也可
27、以将一个表达式的值赋给一个变量。(三)赋值运算符和赋值表达式2、变量赋初值程序中常需要对一些变量预先设置初值。C语言允许在定义变量的同时使变量初始化。如:int a=3;/*指定a为整型变量,初值为3*/也可以使被定义的变量的一部分赋初值。如 int a,b,c=5;/*表示指定a,b,c为整型变量,c的初值为5*/如果要对几个变量赋予相同的初值,则:int a=3,b=3,c=3;()int a=b=c=3;()或:int a,b,c;a=b=c=3;第32页/共42页3、复合的赋值运算符在赋值符“=”之前加上其他运算符,可以构成复合的运算符。例如,可以有:a+=3 等价于 a=a+3x*=
28、y+8 等价于 x=x*(y+8)(注意:括号的使用)x%=3 等价于 x=x%3凡是二元(二目)运算符,都可以与赋值符一起组合成复合赋值符。C语言规定可以使用10种复合赋值运算符:+=,-=,*=,/=,%=,=,&=,=,|=,后5种是有关位运算的,将在第12章介绍。第33页/共42页(1)将实型数据(包括单、双精度)赋给整型变量时,舍弃实数的小数部分。(2)将整型数据赋给单、双精度变量时,数值不变,但以浮点数形式存储到变量中。(3)将一个double型数据赋给float变量时,截取其前面7位有效数字,存放到float变量的存储单元(32位)中。注意:数值范围不能溢出。(4)字符型数据赋给
29、整型变量时,由于字符只占1个字节,而整型变量为2个字节,因此将字符数据(8位)放到整型变量低8位中。有两种情况:(若字符376)11 11 11 100 0 00 00 00 11 11 11 10c=376c=37611 11 11 101 1 11 11 11 11 11 11 10a、如果所用系统将字符处理为unsigned charb、如果所用系统将字符处理为signed char4、类型转换如果赋值运算符两侧的类型不一致,但都是数值型或字符型时,在赋值时系统会自动进行类型转换。第34页/共42页(5)将一个int、short、long型数据赋给一个char型变量时,只将其低8位原封不
30、动地送到char型变量。(6)将带符号的整型数据int型赋给long型变量时,要进行符号扩展,将整型的16位送到long型低16位中,如果int型数据为正,则高16位补0;反之,则高16位补1。若将一个long型数据赋给一个int型变量时,只将long型数据中低16位原封不动地送到整型变量中。(7)将unsigned int型数据赋给long int型变量时,不存在符号扩展问题,只需将高位补0即可。(8)将非unsigned型数据赋给长度相同的unsigned型变量,也是原样照赋(连原有的符号位也作为数值一起传送).第35页/共42页例 3.7 有符号数据传送给无符号变量:main()unsi
31、gned a;int b=-1;a=b;printf(“%u”,a);运行结果为:655351 1 11 11 11 11 11 11 1111 11 11 11 11 11 11 11ba赋值情况见下图:如果b为正值,且在032767之间,则赋值后数值不变。总结:不同类型的整型数据间的赋值归根到底就是一条:按存储单元中的存储形式直接传送。第36页/共42页5、赋值表达式 由赋值运算符将一个变量和一个表达式连接起来的式子称为“赋值表达式”。它的一般形式为:也可以是赋值表达式如:a=(b=5);赋值表达式也可以包含复合的赋值运算符。如:a+=a-=a*a 如果a的初值为12,此赋值表达式的求解步
32、骤如下:(1)先进行“a-=a*a”的运算,它相当于a=a-a*a=12-144=-132。(2)再进行“a+=-132”的运算,相当于a=a+(-132)=-132-132=-264。将赋值表达式作为表达式的一种,使赋值操作不仅可以出现在赋值语句中,而且可以以表达式形式出现在其它语句(如输出语句、循环语句等)中,如:printf(“%d”,a=b);如果b=3,则输出a的值也为3。在一个语句中完成了赋值和输出双重功能。返回返回第37页/共42页(四)强制类型转换运算符 其一般形式为:(类型名)(表达式)注:表达式应该用括号括起来。如果写成:(int)x+y则只将x转换成整型,然后与y相加。正
33、确写法是:(int)(x+y)/*将x+y的值转换成整型*/需要说明的是:在强制类型转换时,得到一个所需类型的中间变量,原来变量的类型未发生变化。例 3.8 强制类型转换。main ()float x;int i;x=3.6;i=(int)x;printf(“x=%f,i=%d”,x,i);运行结果:x=3.600000 ,i=3x类型仍为float型,值仍等于3.6。从上可知,有两种类型转换,一种是在运算时不必用户指定,系统自动进行的类型转换,如3+6.5。另一种是强制类型转换。返回返回第38页/共42页(五)逗号运算符和逗号表达式C语言提供一种特殊的运算符逗号运算符。用它将两个表达式连接起
34、来。如:3+5,6+8 称为“逗号表达式”,又称为“顺序求值运算符”。逗号表达式一般形式为:表达式1,表达式2,表达式n逗号表达式的求解过程:先求解表达式1,再求解表达式2,再求解表达式n,整个逗号表达式的值是表达式n的值。如:“3+5,6+8”的值为14。一个逗号表达式又可以与另一个表达式组成一个新的逗号表达式,如:(a=3*5,a*4),a+5 第39页/共42页逗号运算符是所有运算符中级别最低的。因此,下面两个表达式中的x值是不同的:1、x=(a=3,6*3)赋值表达式2、x=a=3,6*a 逗号表达式注意:1、逗号表达式最常用于循环语句(for语句)中。2、并不是任何地方出现的逗号都是作为逗号运算符。如:printf (“%d,%d,%d”,a,b,c);“a,b,c”并不是一个逗号表达式。返回返回第40页/共42页本章小结 在本章中我们主要介绍了两个大问题:数据类型和运算符与表达式1C语言中有丰富的数据类型,本章主要介绍了基本类型中的整型、实型和字符型,以及这三种类型的常量与变量的定义与应用。2C语言中有丰富的运算符,本章主要介绍了算术运算符、赋值运算符、强制类型转换运算符以及逗号运算符,要求同学们在正确使用上述运算符的同时,要注意运算符的优先级与结合方向,这也是本章的重点与难点。返回返回第41页/共42页感谢您的欣赏!第42页/共42页