收藏 分销(赏)

第三章-C语言-第三章-.ppt

上传人:a199****6536 文档编号:13240322 上传时间:2026-02-09 格式:PPT 页数:73 大小:507KB 下载积分:8 金币
下载 相关 举报
第三章-C语言-第三章-.ppt_第1页
第1页 / 共73页
第三章-C语言-第三章-.ppt_第2页
第2页 / 共73页


点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,语言程序设计,第三章,数据类型、运算符和表达式,一、,C,语言的数据类型,二、,C,语言的变量和常量,2.1 常量和符号常量,1、常量:在程序运行过程中,其值不能被改,变的量。,每种数据类型都有常量,也都有变量。如整型常量、浮点型常量.例如:,12、4、-67 或,3.14,5.6 或,a、d,从上可以看出常量可以是不同类型的.,2、常量分为两种直接常量和符号常量。,直接常量直将数值直接使用,如:,a=b*,10,;,当用一个标志符代表一个常量时,称为符号常量.,2.1 常量和符号常量,1、常量:在程序运行过程中,其值不能被改,变的量。,每种数据类型都有常量,也都有变量。如整型常量、浮点型常量.例如:,12、4、-67 或,3.14,5.6 或,a、d,从上可以看出常量可以是不同类型的.,2、常量分为两种直接常量和符号常量。,直接常量直将数值直接使用,如:,a=b*,10,;,当用一个标志符代表一个常量时,称为符号常量.,2.2 变量,在程序运行过程中,,其值可以改变,的量称为变量。,一个变量应该有一个变量名,并且,在内存中占据一定的的存储单元,用来存放变量的值。,注意:变量名与变量值的区别,在,C,语言中,要求对所有用到的变量作强制定义,即“,先定义、后使用,”。,因为:,1、编译程序不能翻译未定义变量。,2、编译程序在编译时根据变量类型确定存储单元的数量并分配空间,3、编译程序在编译时根据变量类型进行语法检查。例,整型变量,a、b,可以进行“求余”运算,a%b;,若把,a、b,定义为实数,则上述运算非法。,main(),int i,studentNo;,i=5;,studentno=5;,/*,错在哪里*/,j=3;,/*,错在哪里*/,一条变量说明语句由数据类型和其后的一个或多个变量名组成。变量说明的形式如下:,类型;,这里类型是指,Turbo C2.0,的有效数据类型。,变量表是一个或多个,标识符名,每个标识符之间用,分隔。,例如:,int i,int i,j,k;,char c,str5,*p;,所谓,标识符,是指常量、变量、语句标号以及用户自定义函数的名称。,Turbo C 2.0,标识符的定义十分灵活。作为标识符必须满足以下规则:,1.,所有标识符必须由一个字母(,az,AZ),或下划线(_)开头;,2.,标识符的其它部分可以用字母、下划线或数字(09)组成;,3.,大小写字母表示不同意义,即代表不同的标识符;,4.,标识符只有前32个字符有效(,Turbo C),5.,标识符不能使用,Turbo C2.0,的关键字。,2.3标识符,下面举出几个正确和不正确的标识符:,正确,-,不正确,smart,-,5smart_decision,-,bomb?key_board,-,key.board FLOAT,-,float,三、整型数据,整型常量即整常数按不同的进制区分,整型常数有三种表示方法:,十进制数,:,以非0开始的数,如:220,-560,45900,八进制数,:,以0开始的数,如:06;0106,05788,十六进制数,:,以0,X,或0,x,开始的数,如:0,X0D,0XFF,0 x4e,3.1.整型常量,main(),int i;,i=11;,printf(“i=%dn”,i);,i=011;,printf(“i=%dn”,i);,i=0 x11;,printf(“i=%dn”,i);,i=0X11;,printf(“i=%dn”,i);,程序的输出结果是多少?,注意:,可在整型,常数,后,添加一个,L,或,l,字母,表示该数为,长整型数,如22,L,0773L,0Xae4l。,另外,所有整数的缺省类型是,int,,可在整型常数后添加一个,L,或,l,字母表示该数为长整型数,如 22,L,0773L,0Xae4l。,若加上,一个,u,或,U,字母表示该数为无符号,整型数,如27,u,0400u,0 xb8000000u。,若加上一个,ul,或,UL,字母表示该数为无符号长整型,数,如 27,ul,0400UL,0 xb8000000UL。,当整数的值超出,int,类型所能表示的范围时称为整数,溢出,。,1整型变量的分类:,加上不同的修饰,符,整型变量有以下几种类型;,C,语言标准没有规定整型变量在计算机内存中所占的字节数,它与具体的机器和操作系统有关:,3.2、整型变量,2.整型变量的定义,可以用下列语句定义整型变量:,int a,b;,/*a、b,被定义为有符号短整型变量*/,unsigned long c;,/*c,被定义为无符号长整型变量*/,unsigned short c,d;,/*,指定变量,c、d,为无符号短整型*/,long e,f;,/*,指定变量,e、f,为长整型*/,程序中在函数的开头部分定义变量。,main(),int a,b,c,d;,/*,指定变量,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);,程序运行显示:,a+u=22,b+u=-14,3.整型变量的溢出,main(),int i,j;,unsigned k,l,m;,i=32767;,j=i+1;,l=65535u;,m=l+2;,printf(j=%dn,j);,printf(l=%un,l);,printf(m=%un,m);,象这类问题体现了,C,语言灵活性所带来的副作用。,这种错误系统不给提示,由程序员自己控制。,四、实型数据,实数(,real),又称为浮点数(,float,),有两种表达方式:,普通(十进制)方式:,0.123、.123、123.0、123.、0.0(必须有小数点),指数方式:,123,e3,或123,E3、123E-2,注意,:字母,e(,或,E),之前必须有数字,e,后面指数必须为整数,规范化指数形式,:,e,前的小数部分中,小数点左边只能有一位非0数字。如下面例子应为:1.23,e5,错误:0.123,e6,4.1 实型常量,4.2 实型变量,精确程度,例:,float x,y;/*,指定,x、y,为单精度实型变量*/,double z;/*,指定,z,为双精度实型变量*/,实型常量不分,float,和,double。,问题:如何用图示的方法表示这些变量的内存空间?,4.3 实型变量的误差与精度,main(),float a,b;,a=123456.789e5;,b=a+20;,printf(“%fn”,a);,printf(“%fn”,b);,注意输出结果,main(),float a;,double b;,a=111111.111;,b=111111.111;,printf(“%fn”,a);,printf(“%fn”,b);,注意输出结果,五、字符型数据,用,单引号,(撇号)括起来的一个字符。,如:,a、x、D、?、$。,注意,,a,和,A,是不同的字符常量。,因为,C,语言区分大小写。,以“”开头的字符序列,称为“,转义序列,”。,“”使其后面的字符变为另外的意义。见下表。,5.1 字符常量,转义序列主要用来控制打印机和屏幕输出。,例:,printf(n sum is%dnn,sum);,比较下面两句的区别:,printf(“this is a“test”);,/*,出错*/,printf(“this is a“test”);,/*,输出:,this is a“test”,*/,char c1,c2;/*,定义,c1、c2,为字符变量*/,c1=a;c2=b;,字符变量在内存中占一字节。,问题:如何用图示的方法表示这些变量的内存空间?,5.2 字符变量,字符在内存中以,ASCII,码存放。,5.3 字符数据在内存中的存储形式及其使用方法,main(),char c1,c2;,c1=A;c2=B;,printf(%c%c,c1+32,c2+32);,该例的输出是:,a b,main(),char c1,c2;,c1=a;c2=b;,c1=c1-32;c2=c2-32;,printf(%c%c,c1,c2);,C,语言允许字符和整数之间进行运算,字符常量,:,单引号,括起来的,一个字符,。,字符串常量,:,双引号,括起来的,字符序列,(0,N,个字符)。如:,How do you do.,CHINA,a,$123.45,字符串常量在内存中的存放:,每一个字符均以其,ASCII,码存放,,且最后添加一个“空字符”,(二进制00000000,记为,NULL,或0。字符0在内存中存0,x30,即00100000)。,5.4 字符串常量,例:字符串常量“,CHINA”,存放在内存中的情况是:(6字节存储器空间,不是5字节),因此,,字符,a,和字符串,a,的区别,是:,字符,a:,1,字节,(值为97),字符串,a:,2,字节,(值为97,0),5.5 字符与整型的相互转换,main(),char c1,c2;,c1=a;c2=b;,printf(“c1=%c,c2=%c n”,c1,c2);,printf(“c1=%d,c2=%d n”,c1,c2);,/*,问题:结果如何*/,六、变量赋初值,为什么要给变量赋初值?(教室不打扫),因为分配的内存空间可能有一个,脏数据,。如果不赋初值,默认初始值就是这个脏数据。(举例说明),1.定义的同时给变量赋初值,如:,int a=3;float b=3.1415;,char c=x;,2.,定义变量时,可以对其中的一部分变量赋初值.如:,int a=3,b,c,d=8;,3.把一个值赋给不同变量时,要分别进行。,如不应写为:,int a=b=c=3;,而应写为:,int a=3,b=3,c=3;,4.,初始化是在程序运行时,执行本函数时赋以初值的。即不是编译时赋以初值的。如:,int a=3;,相当于:,int a;a=3;,int a,b,c=5;,相当于:,int a,b,c;,c=5;,七、各类数值型数据间的混合运算,在,C,语言中,整、实、字符型数据间可以混合运算,如:,10+,a+1.5-8765.1234*b,1、不同类型数据间进行运算时,要转换成同一类型,转换过程中,低类型向高类型靠拢,然后进行运算,不同类型之间转换如下图所示,,横向左箭头为必转,纵向箭头表示有条件类型转换。,例:,char,数据在运算前,必定,转换为,int,数据;,int,数据,可以转换,为,unsigned,数据;,float,数据在运算前,必定,转换为,double,数据(即使两个,float,相加);,int,数据可以转换为,double,数据(若另外一个运算数据为,double),(,直接转换,不需先转换为,unsigned,long,,再转换为,double)。,上式的运算次序是,:,进行10+,a,运算。先将,a,转换为整数97,运算结果为整数107。,进行,i*f,运算。先将,i,和,f,均转换为,double,类型(实运算过程总是使用,double,类型,仅在把结果存入存储器时,才可能使用,float,类型),运算结果是,double,类型。,整数107与,i*f,的积相加。先将整数107转换为,double,类型(107.0),运算结果是,double,类型。,进行,d/e,运算。先将,long e,转换为,double,类型,运算结果是,double,类型。,进行-运算,结果为,double,类型。,八、算术运算符和算术表达式,8.1,C,运算符简介,8.2算术运算符和算术表达式,1、基本的算术运算符,+:加法或正值运算符,如:2+3、+5,-:减法或负值运算符,如:8-3 、-6,*:乘法运算符,如:3*5,/:除法运算符,则可以是整或实型数据。如5/3,%:求余运算符,两侧必是,整型数据,。如7%4,注:-5/3=-1(余-2)或-2(余+1),,Turbo C,取-1结果(“向零取整”)。,2、算术表达式和运算符的优先级与结合性,算术表达式:如:,a*b/c-1.5+a,在,C,语言中,运算符共有15个优先级,其中算术运算符的优先级是:,*、/、%(3级)+、-(4级),请见,P375376,算术运算符的结合方向:从左向右,注意:对于运算符的结合方向,只需记住,三种运算符是自右向左,的,其余都是自左向右的。这三种运算符是:,单目运算符、,三目运算符(,only one)、,赋值运算符(不计算好如何赋值?),例:,a=b+c,由于赋值运算符=为右结合,,先执行右边的,b+c,,再赋值给,a。,8.3、强制类型转换运算符,一般形式:,(类型名)(表达式),如:(,double)a,将,a,转换为,double,型,(,int)(x+y),将,x+y,的值转换为整型,(,float)(5%3),将5%3的值转换成单精度实型,说明:,1.(,int)(x+y),与(,int)x+y,意义不同,2.类型转换后得到一个中间值,而原来变量本身的类型没有发生变化。,3.(,int)x,不要写成,int(x);,/,*,C,语言中,不行,,c+,允许*/,main(),float x,i;x=3.6;i=(int)(x);,printf(“x=%f,i=%fn”,x,i);,运算结果:,x=3.600000,i=3.000000,思考:程序运行期间,,x,i,的类型和值发生变化没有?,8.4、自增、自减运算符,+:增1运算符,使变量值增1。,记忆:+在前,先加;在后,后加,-:减1运算符,使变量值减1。,如:,+,i,-i:,在使用变量,i,之前,先使变量,i,加(减)1。,i+,i-:,在使用变量,i,之后,使变量,i,值加(减)1。,main(),int i,j;i=3;j=+i;,printf(“i=%d,j=%dn”,i,j);,运算结果:,i=4,j=4,main(),int i,j;i=3;j=i+;,printf(“i=%d,j=%dn”,i,j);,运算结果:,i=4,j=3,说明:,1.+,-运算符只能用于变量,而不能用于常量和表达式。,如,a+,b-,是正确的,而5+,(,x+y)-,却是错误的。,2.+,-运算符的结合方向是从右向左。,main(),int i,j;,i=3;,i+;,j=i;,printf(“i=%d,j=%dn”,i,j);,运算结果?,main(),int i;i=3;,printf(“i1=%dn”,-i+);,printf(“i2=%dn”,i);,运算结果:,i1=-3 i2=4,注意:结合性自右向左(单目运算符),main(),int i;i=3;,printf(“i1=%dn”,-+i);,printf(“i2=%dn”,i);,运算结果:,i1=-4 i2=4,main(),int i=3,j=3,k,q;,k=(i+)+(i+)+(i+);,q=(+j)+(+j)+(+j);,printf(“i=%d,j=%d,k=%d,q=%dn”,i,j,k,q);,TC,运算结果:,i=6,j=6,k=9,q=18,1)、,无需深究的问题,表达式中的子表达式的求值顺序各编译系统是有差别的。,2)在,C,语言中运算符的确定,在由多个字符组成的表达式中,应,尽可能多地从左向右,将若干个字符组成一个运算符。,如:,i+j,其结合性是:(,i+)+j,不是:,i+(+j)。,3),printf,函数输出实参的顺序,如:,int i=3;printf(“%d,%dn”,i,i+);,有的系统按从左到右的顺序求值,输出结果是:3,3,而,Turbo C,是按从右到左顺序求值,输出结果是:4,3,结论:不写别人甚至自己都看不懂的程序,也不写那些不知道系统会怎样运行的程序.,九、赋值运算符和赋值表达式,9.1、赋值运算符,“=”是赋值号,也是赋值运算符,功能:将赋值号右边表达式的值赋给赋值号左边的变量,赋值号同时含有计算的功能。,如:,a=3;b=x*y;,a,b,变量中原来不管存放什么值,执行赋值语句后,新值将取代旧值,9.2、类型转换,(1)实型数据赋给整型变量时,舍去实型数据的小数部分。,如:,int i;i=3.56;,结果,i,的值为3,(2)整型数据赋给实型变量时,数值不变,但以浮点形式存放于内存。,如:,float a=23;,先将23转换成23.000000,然后送,a,中。,double b=23;,先将23转换为23.00000000000000,然后送,b,中,(3),double,型数据赋给,float,变量,截取其前面的7位有效数字,存放到,float,单元,应注意数值范围不能溢出,如:,float f;,double d=123.45678e65;,f=d;,由于数据溢出,,f,将得到错误的值,float,数据赋给,double,变量时,数值不变,有效位扩展到16位。,(4)字符型数据赋给整型变量,(5),int,short,long,型数据赋给,char,变量,则将其低位赋给,char,型变量,(6),long,型数据赋给,int,型变量,将,long,型数据的低16位赋给,int,型变量,(7)将,unsigned int,型数据赋给,long,型变量时:,将,unsigned int,型数据送到,long int,型变量的低16位,,long int,的变量高16位补0,若无符号数据赋给相同长度的带符号的变量时,则原样赋给。,要注意数据的有效位占据符号位,若最高位为1,则赋值后新变量的值成负。,(8)将带符号的数赋给长度相同的无符号变量,原样赋给,main(),unsigned int a;,int b=-1;,a=b;,printf(“a=%u,b=%dn”,a,b);,运算结果:,a=65535,b=-1,9.3、复合的赋值运算符,在赋值号前加其它运算符,可以构成复合运算符。,如:,a=a+b,等价于,a+=b,x=x*(y+8),等价于,x*=y+8,x=x%3,等价于,x%=3,为了便于记忆,将赋值号左边移到赋值号右边,赋值号,左边再补上变量名。,如:,a+=b,a+,复制到=右边,等号左边补操作数,a,a=a+b,其中,a,是变量,,b,是表达式,x*=y+8 -,x=x*(y+8),而不是,x=x*y+8,C,语言中,有十个二元运算符:+、-、*、/、%、,、&、|可与赋值号一起构成复合运算符;,其优点是:简化程序,提高编译效率。,9.4、赋值表达式,由赋值运算符将一个变量和一个表达式连接起来的式子。,(1)一般形式:,a=5;,(2),赋值表达式求解过程:,计算赋值号右边表达式的值,然后赋给左边的变量。,如:,a=3+5,在,C,语言中,表达式又可以是赋值表达式,如,a=(b=5);,其中,b=5,是赋值表达式,其值是5,因此,a,的值是5,整,个表达式的值是5。,(3)赋值运算符的结合顺序:从右向左,因此:,a=(b=5),与,a=b=5,是等价的。,赋值表达式的例子:,a=b=c=5,表达式的值为5,,a,b,c,的值为5。,a=5+(c=6),表达式的值为11,,a,的值为11,,c,的值为6。,a=(b=4)+(c=6),表达式的值为10,,a,的值为10,b,为4,c,为6。,a=(b=10)/(c=2),表达式的值为5,,a,的值为5,b,为10,c,为2。,(4)赋值表达式也可以包含复合的赋值运算符,main(),int a=12,b;,b=(a+=a-=a*a);,printf(“a=%d,b=%dn”,a,b);,运算结果:,a=-264,b=-264,a +=a-=a*a,a=a-a*a,12-12*12,-132,a=a+(-132),-132+(-132),-264,十、逗号运算符和逗号表达式,逗号运算符:,,,又称“顺序求值运算符”;,优先级最低,逗号表达式:用逗号将两个表达式连接起来的式子。,形式:表达式1,表达式2,求解过程:先求表达式1的值,再求表达式2的值,整个表达式的值是表达式2的值。,注:表达式1和表达式2又可以分别由若干个逗号表达式,组成。因此,逗号表达式又可扩展为:,表达式1,表达式2,表达式,n,如:,3*5,68,表达式14,(,a=3*5,a*4),变量,a15,表达式60,main(),int a,b;,b=(a=3*5,a*4),a+5);,printf(“a=%d,b=%dn”,a,b);,运算结果:,a=15,b=20,1,.,逗号运算符是一个顺序求值运算符,main(),int x,a=1,b=2,c=3;,x=a,b,c;printf(“x=%dn”,x);,运算结果:,x=1,main(),int a=1,b=2,c=3,x;,x=(a,b,c);printf(“x=%dn”,x);,结果:,x=3,2.并非所有出现“,”的地方都是逗号运算符,如函数中,的参数分隔符,main(),int a=1,b=2,c=3;,printf(“%d,%d,%dn”,a,b,c);,printf(“%d,%d,%dn”,(a,b,c),b,c);,运算结果:1,2,3,3,2,3,
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服