精品课程:C语言程序设计:第三章 数据类型、运算符与表达式_第1页
精品课程:C语言程序设计:第三章 数据类型、运算符与表达式_第2页
精品课程:C语言程序设计:第三章 数据类型、运算符与表达式_第3页
精品课程:C语言程序设计:第三章 数据类型、运算符与表达式_第4页
精品课程:C语言程序设计:第三章 数据类型、运算符与表达式_第5页
已阅读5页,还剩58页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第三章数据类型、运算符与表达式本章主要任务: 1、了解C语言丰富的数据类型;常量、变量的概念。 2、掌握变量定义原那么和符号常量定义方法。 3、掌握常用根本数据类型(整型、实型、字符型)数据的常量表示、机内存储、变量分类以及掌握正确选择数据类型。 4、了解数值型数据混合运算及类型转换规律。5、了解C语言的丰富运算符,丰富的运算符可以构成灵活的表达式. 6、掌握算术、赋值、逗号运算符及它们构成的表达式。 7、掌握运算符的优先级、结合性规律。3.1C的数据类型C语言提供的数据结构是以数据类型形式出现的,C的数据类型如下:整型字符型单精度基本类型实型枚举类型双精度

数据类型数组类型构造类型结构体类型共用体类型指针类型

空类型C语言的根本词法〔1〕字符集:英文字母、数字、特殊字符和转义字符〔2〕标识符:由字母、数字和下划线三种字符构成的且第一个字符必须是字母或下划线的字符序列。〔3〕标识符的分类①关键字:C语言规定的具有特定含义的标识符。②预定义标识符:也具有特定含义,如C语言提供的库函数的名字和编译预处理命令。③用户标识符:用户根据自己的需要而定义的标识符。3.2常量与变量常量和符号常量

在程序运行过程中,其值不能被改变的量称为常量。常量区分为不同的类型,如12、0、-3等为整型常量,4.6,-1.23等为实型常量,’a’,’d’为字符常量,一般从其字面形式即可判别,也可以用一个标识符代表一个常量。常量例如#definePRICE30#defineNUM12voidmain(){......total=NUM*PRICE;total2=84*PRICE2;printf("total=%d",total);......}不会被替换=>total=12*

30;常量符号常量「例3.1」#definePI3.1415926main(){floats,r,l;r=10.;l=2.*PI*r;s=PI*r*r;printf("l=%fs=%f\n",l,s);printf("PI=%f\n",PI);}程序中用#define命令行定义PI代表常量3.1415926,此后凡在此文件中出现的PI都代表3.1415926,可以和常量一样进行运算.习惯上,符号常量名用大写,变量用小写,以示区别这种用一个标识符代表一个常量的,称为符号常量,即标识符形式的常量,注意符号常量不同于变量,它的值在其作用域〔在本例中为主函数〕内不能改变,也不能再被赋值。如再用以下赋值语句给PI赋值:PI=3.1416是错误的。3.2.2变量在程序运行过程中,其值可以改变的量称为变量。一个变量应该有一个名字,在内存中占据一定的存储单元。在该存储单元中存放变量的值。变量声明的一般形式:

数据类型名变量名;变量的数据类型一方面决定变量所占用存储单元的大小另一方面决定变量所允许施加的运算有哪些。注意,大写字母和小写字母被认为是两个不同的字符。C语言中标识符的长度〔字符个数〕取8个字符,假设程序中出现的变量名长度大于8个字符,那么只有前面8个字符有效,后面的不被识别。例如,有两个变量:student_name和student_number,由于二者的前8个字符相同,系统认为这两个变量是一回事而不加区别。可以将它们改为:stud_name和stud_num以使之区别。在选择变量名和其它标识符时,应做到“见名知意〞。在C语言中,要求对所有用到的变量作强制定义,也就是“先定义,后使用〞,否那么,在编译时会指出有关“出错信息〞。3.3整型数据3.3.1整型常量整型常量即整常数。C整常数可用以下三种形式表示:1.十进制整数。如123、-456、0。2.八进制整数。以O开头的数是八进制数。如O123表示八进制数123,即(123)8等于十进制数83。-011表示八进制数-11,即十进制数-9。3.十六进制整数。以0x开头的数是16进制数。如0xl23,代表16进制数123,即〔123〕16=1I62+2161+3160=256+32+3=291。-0xl2等于十进制数-18。3.3.2整型变量一、整型变量的分类整型变量可分为:根本型、短整型、长整型和无符号型四种。1.根本型,以int表示。2.短整型,以shortint表示,或以short表示。3.长整型,以1ongint表示,或以1ong表示。4.无符号型,存储单元中全部二进位〔bit〕用作存放数本身,而不包括符号。无符号型中又分为无符号整型、无符号短整型和无符号长整型,分别以unsignedint,unsignedshort,unsignedlong表示。C语言标准没有规定整型变量在计算机内存中所占的字节数,它与具体的机器和操作系统有关:IBMPC所占位数数的范围int16-32768~+32767short16-32768~+32767long32-2147483648~+2147483647unsignedint160~65535unsignedshort160~65535unsignedlong320~4294967295二、整型变量的定义C规定在程序中所有用到的变量都必须在程序中指定其类型,即“定义〞,这是和BASIC、FORTRAN不同的,而和PASCAL相类似。例如:inta,b;(指定变量a,b为整型)unsignedshortc,d;(指定变量c,d为无符号短整型)1onge,f;〔指定变量e,f为长整型〕对变量的定义,一般是放在一个函数的开头局部例3.2/*example3.2onpage43*/main(){inta,b,c,d;/*指定a,b,c,d为整型变量*/unsignedu;/*指定u为无符号整型变量*/a=12;b=-24;u=10;c=a+u;d=b+u;printf("a+u=%db+u=%d",c,d);}运行结果为a+u=22b+u=-14

可以看到不同种类的整型数据可以进行算术运算。3.3整型数据的溢出 整型数最大允许值+1,最小允许值-1,会出现什么情况?例3.3:整型数据的溢出voidmain(){inta,b;a=32767;b=a+1;printf("\na=%d,a+1=%d\n",a,b);a=-32768;b=a-1;printf("\na=%d,a-1=%d\n",a,b);}结论: 超出范围就发生“溢出〞,运行时不报错。a=32767,a+1=-32768a=-32768,a-1=32767三、整型常量的类型1.一个整常量,如果其值在-32768~+32767范围内。认为它是int型,它可以赋值给int型和1ongint型变量。2.一个整常量,如果其值超过了上述范围,而在一2147483648~2147483647范围内,那么认为它是1ongint型。可以将它赋值给一个1ongint型变量。3.在一个整常量后面加一个字母l或L那么认为是1ongint型常量。练习:1、按照C语言规定的用户标识符命名规那么,不能出现在标识符中的是〔〕A〕大写字母B〕连接符C〕数字字符D〕下划线2、在C语言中,不正确的int类型的常数是〔〕A)32768B)0C)037D)0xAF3、在C语言中,合法的长整型常数是 A)0LB)4962710C)0.054838743D〕2.1869e103.4实型数据一、实型常量即实数也称浮点数〔float-point〕。有两种表现形式:1、十进制小数形式:由数字和小数点组成〔注意:必须有小数点!〕如:0.123、0.0、.123、123.2、指数形式:在内存中实型数据按指数形式存放。如:3.14159e0、3141.59e-3、0.0314159e2注意:字母〔e/E〕前面必须要有数字,e后面的指数必须是整数。而且在e/E的前后以及数字之间不允许插入空格!!!如果写成:e3、.5e3.6、.e3、e等都是不合法的指数形式。一个实数用指数形式输出时,按标准化的指数形式输出。标准化的指数形式:在e之前的小数局部中,小数点左边有且只有一位非零数字。二、实型变量

C语言中实行变量分为单精度型和双精度型两类,分别用类型名float和double进行定义。单精度型变量定义的形式如下:floata,b,c;双精度型变量定义的形式如下:doublex,y,z;一般计算机系统中,为float类型的变量分配4个字节的存储单元,为double类型的变量分配8个字节的存储单元,并按实型数的存储方式存放数据。在TC中单精度实数的数值范围约在-10-38——1038之间,并提供7位有效位,小于10-38的数被处理成零值。双精度实数的数值范围约在-10-308——10308之间,并提供15——16位有效位,具体精确到多少位与机器有关;小于10-308的数被处理称零值。因此double型变量中存放的数据要比float型变量中存放的数据精确的多。注意:在计算机内存中可以精确的存放一个整数,不会出现误差,但整型数值的存放范围较小;使用实型数的范围大,但往往存在误差。这是因为实型变量是用有限的存储单元存储的,能提供的有效位也有限,在有效位之外的数字将被舍去,由此可能产生误差。实型的变量只能存放实型数,不能用整型变量存放一个实数,也不能用实型变量存放一个整数。

main(){inti;floatm; i=2.0;m=9; printf("%d\n",m); printf("%f",i);}结果为:0262144.002804不是我们想要的结果;3.5字符型数据一、字符常量:C语言中,一个字符常量代表字符集中的一个字符,在程序中用单引号把一个字符括起来作为字符常量。例如:‘a’、’A’、’x’、’$’等都是合法字符常量。说明:〔1〕单引号的大写字母和小写字母代表不同的字符常量。〔2〕字符常量只能包含一个字符。〔3〕字符常量只能用单引号括起来,不能用双引号括起来。字符常量在内存中占一个字节,存放的是字符的ASCII代码值。二、转义字符常量:一种特殊形式的字符常量,又称反斜线字符,总是以一个反斜线开头后跟一个特定的字符,来代表某一个特定的ASCII字符,这些字符常量也必须括在一对单引号内。如:‘\n’换行、‘\b’退格、‘\ddd’——1到3位的8进制数代表的字符;‘\xhh’——1到2位的16进制数代表的字符;‘\0’——空操作等。〔书p48〕注意:反斜线后的16进值数不允许用X开头,也不能用0x开头练习:选出正确的转义字符:'//''\'''\t''\1011''\018''/123''\xaa''\0xaf'三、字符变量:

用来存放字符常量的量,注意只能放一个字符。在C语言中,字符变量用关键字char进行定义;在定义的同时可以赋初值。例如:charch1=‘*’,ch2=‘a’,ch3;所有的编译系统规定字符变量在内存中占一个字节,字符变量可以存放ASCII字符集中的任何字符。当把字符放入字符变量中,字符变量中的值就是该字符的ASCII代码值。所有字符变量可以作为整型变量来处理,可以参与对整型变量所允许的任何运算。例3.6字符变量举例main(){charc1,c2;c1='a';c2=98;printf("%c,ASCII:%d\n",c1,c1);printf("%c,ASCII:%d\n",c2,c2);}四、字符串常量:用双引号括起来的字符序列。如:“hello〞,“howdoyoudo?〞在C语言中,系统在每个字符串的最后自动参加一个字符‘\0’作为字符串的结束标志。C语言中没有专门的字符串变量,假设将一个字符串存放在变量中,必须使用字符数组,即用一个字符型数组来存放一个字符串,数组中每一个元素存放一个字符。字符常量与字符串常量的区别:1、字符常量是用单引号括起来的,字符串常量用双引号括起来;2、字符变量中只能存放字符常量的值,而不能存放字符串常量的值。〔因为字符变量也只占1个字节,C语言规定1个字符占1个字节,所以字符变量只能放一个字符〕例如:‘\101’、‘z’是字符常量,在内存中占一个字节;而“ABC\n〞、“z〞是字符串常量,前者占5个字节,后者占2个字节的存储空间,其中一个字节用来存放‘\0’。练习:1、合法的C语言字符常量是()A)'\t'B)“A〞C)65D)A2、在C语言中,合法的字符常量是()A)'\084’B)‘\x43’C)’ab’D)〞\0〞3、以下不正确的转义字符是()A)‘\\’B)‘\’C)‘074’D)‘\0’4、设有说明语句:chara=‘\72';那么变量a() A)包含1个字符 B)包含2个字符 C)包含3个字符 D)说明不合法5、以下选项中,非法的字符常量是() A)’\t’B)'\17' C)“\n〞D)‘\xaa’3.7各类数值型数据间的混合运算C语言允许整型、实型、字符型数据间可以混合运算,但不同类型的数据要先转换成同一类型,然后再运算。类型转换规那么:1、char、short型必定转换成int型;2、float型必定转换成double型;3、int型unsignedintlongintdouble型由低到高转换。例1:inti;floatf;doubled;longe;分析10+‘a’+i*f-d/e的结果的类型。例2:charch;inti,result;floatf;doubled;result=ch/i+f*d-(f+i);分析result的最终数据类型。说明:一般算术转换是在运算过程中系统自动进行的。3.8算术运算符与算术表达式一、C运算符简介:C语言的运算符包含的范围很广,共有34种,可分为算术运算符、关系运算符、逻辑运算符、位运算符、赋值运算符、条件运算符、逗号运算符、指针运算符、求字节数运算符、强制类型转换运算符、分量运算符、下标运算符以及其它一些运算符。二、根本的算术运算符:+、-、*、/、%分别为加、减、乘、除和求余运算符。这些运算符需要两个运算对象,称为双目运算符。除求余运算符外,运算对象可以是整型,也可以是实型。求余运算符的运算对象只能是整型。运算结果是两数相除后所得的余数。当运算量为负数时,所得结果的符号随机器而不同,在TC中符号与被除数相同。如:17%-3=2,-19%4=-3三、强制类型转换运算符:C语言规定可以利用强制类型转换运算符将一个表达式转换成所需类型。一般形式为:〔类型名〕〔表达式〕如:〔int〕a;〔double〕〔x+y〕注意:表达式要用括号括起来。〔float〕〔5/3〕=1.000000〔先计算后转换类型〕说明:在强制类型转换时,得到一个所需类型的中间变量,原来变量的类型并没有发生变化。例如:{floatx=3.6;inti; i=(int)x; printf("%d,%f",i,x);}运行结果为:3,3.600000四、自增、自减运算符1、++和--的运算结果是使运算对象的值增1或者减1。2、I++相当于I=I+1;I--相当于I=I-1,因此,自加或自减运算本身也是一种赋值运算。虽然++I和i++的作用都是使I的值加1,但作为表达式二者有区别的:++I:先执行I=I+1,再使用I值;I++:先引用I值,在执行I=I+1。例如:I=5;j=++I;printf(“%d,%d〞,I,j);结果为:6,6I=5;j=I++;printf(“%d,%d〞,I,j);结果为:6,53、++、--运算符是单目运算符,运算对象可以是整型变量也可以是实型变量,但不能是常量和表达式,因为不能给常量或表达式赋值。4、++、--运算符的结合方向是“自右向左〞例如:有表达式-I++,I的左边是负号运算符,右边是自加运算符。负号运算符和自加运算符优先级相同,结合方向是自右向左,相当于-〔I++〕,先用I的原值进行运算以后,再对i加1。5、不要在同一个表达式中对同一个变量进行屡次自加或自减运算如:I++*++I+I--*--I,这种表达式不仅可读性差,而且不同的编译系统对这样的表达式进行不同的处理,得出的结果也就不相同了。练习:设有定义:intk=0;以下选项的四个表达式中与其他三个表达式的值不相同的是〔〕A〕k++B〕k+=1C〕++kD〕k+1输出下面程序的结果main(){inti,j,k,q;i=9;j=10;k=i++;q=++j;printf("k=%d,q=%d\n",k,q);}五、运算符的优先级〔〕、++、--、*、/、%、+、—

单目双目同级同级同级高低例如:intx;X=3*4%-6/5;printf(“%d\n〞,x);X=3+(7+6)%5/2;printf(“%d〞,x);结果为:04六、算术表达式:用算术运算符和一对圆括号将运算量连结起来的、符合C语法的表达式。运算对象可以是常量、变量和函数等。例如:2+sqrt〔c〕*b.运算规那么和要求如下:1、在算术表达式中,可使用多层括号,但左右括号必须配对。运算从内层括号开始,由内向外依次计算表达式的值。2、假设包含不同优先级的运算符,那么按运算符的优先级别由高到低进行,假设表达式中运算符的优先级相同,那么按运算符的结合方向进行。练习:1、C语言中,运算对象必须是整型数的运算符是 A)%B)/ C)%和/ D)**2、输出下面程序的结果main(){

intx;

x=-3+4*5-6;

printf("x1=%d\n",x);

x=3+4%5-6;

printf("x2=%d\n",x);}3.9赋值运算符和赋值表达式一、赋值运算符:“=〞符号称为赋值运算符,如:a=3;注意:1、赋值号的左边必须是一个代表某一存储单元的变量名,或是代表某存储单元的表达式。赋值号的右边必须是C语言的合法的表达式。2、赋值运算的功能是先求出右边表达式的值,然后把此值赋给等号左边的变量,确切说,是把数据放入以该变量为标识的存储单元中。3、赋值运算符的优先级只高于逗号运算符〔“,〞顺序求值运算符〕,比其它运算符的优先级都低,且具有自右向左的结合型。如:a=2+7/3;先计算右边表达式的值,再把结果4赋给变量a。4、赋值运算符不同于数学中的“等于号〞,这里不是等同的关系,而是进行“赋予〞操作。二、类型转换在赋值运算中,只有在赋值号右侧表达式的类型与左侧变量类型完全一致时,赋值操作才能进行。如果赋值运算符两侧的数据类型不一致,在赋值前,系统将自动先把右侧表达式求得的数据,按赋值号左边变量的类型进行转换,也可以用强制类型转换的方式,人为地进行转换后赋给赋值号左边的变量。但这种转换仅限于数值数据之间,通常称为“赋值兼容〞,对于另外一些数据,例如地址值就不能赋给一般变量,称为“赋值不兼容〞。在C语言的赋值表达式中,赋值号右边的值先转换成与赋值号左边的变量相同的类型,然后进行赋值。三、复合的赋值运算符但凡双目运算符都可以与赋值运算符一起组成复合赋值符,C语言规定可以使用10种复合赋值运算符:+=、-=、*=、/=、%=、?=、?=、&=、^=、|=复合赋值运算符的优先级与赋值运算符的优先级相同。表达式n*=m+3等价于n=n*(m+3),因为+的优先级高于*=的优先级。〔假设复合赋值运算符的右边是包含假设干项的表达式,那么要用括号括起来〕例:inta=9;计算表达式a+=a-=a+a的值。四、赋值表达式由赋值运算符将一个变量和一个表达式连结起来的式子。1、一般形式:<变量><赋值运算符><表达式>例如:a=5;a=〔b=5〕;表达式又可以是一个赋值表达式。2、赋值表达式也可以是包含复合的赋值运算符。3、赋值表达式还可以出现在其它语句中〔输出、循环〕Printf(“%d〞,a=b);完成赋值和输出两种功能。练习:1、设x为int型变量,那么执行以下语句后,x的值为x=10;x+=x-=x-x; A)10B)20C)40D)302、以下可作为C语言赋值语句的是 A)x=3,y=5B)a=b=6C)I--;D)y=(int)x;3、下面程序的输出结果是多少?main(){doublek=10.0,m=5.0;k*=3.5;printf("%f\n",k);k/=m+1;printf("%f\n",k);k+=1/m;printf("%f\n",k);k-=++m;printf("%f\n",k);}3.10逗号运算符和逗号表达式用逗号将表达式连结起来的式子称为逗号表达式,或称“顺序求值运算符〞。逗号表达式的一般形式为:表达式1,表达式2,…表达式n逗号运算符的结合性为从左到右,从左到右进行运算,最后一个表达式的值就是该逗号表达式的值。注意:1)

程序中使用逗号表达式,通常是要分别求逗号表达式内各表达式的值,并不一定要求整个逗号表达式的值。2)并不是在所有出现逗号的地方都组成逗号表达式,如在变量说明中,函数参数表中逗号只是用作各变量之间的间隔符。3)逗号运算符的优先级最低。练习:1、假设x和y都是int型变量,z=100,y=200,且有程序片段:printf(“%d〞,(z,y));,那么 输出结果是 A)200B)100C)100200D)输出格式不够,输出不确定的值 2、设intx=10,y=3,z;那么语句printf("%d\n〞,z=(x%y,x/y));的输出结果是A)lB)OC)4D)33.main(){inta=2,b=4,c=6,x,y;y=(x=a+b),(b+c);printf("y=%d,x=%d",y,x);}输出:?4.main(){intx=2,y,z; x*=3+2; printf("%d\n",x); x*=y=z=4; printf("%d\n",x); x=y=1; z=x++-1; printf("%d,%d\n",x,z); z+=-x+++(++y);printf("%d,%d\n",x,z);}结果为:10402,03,05.main(){inti,j;i=16; j=(i++)+i;printf("%d\n",j); i=15;printf("%d\t%d\n",++i,i); i=20; j=i--+i; printf("%d\n",j); i=13; printf("%d\t%d\n",i++,i);}动脑动手编写程序1、编写一个程序,输入三个数,求它们的平均值并输出。用浮点数据处理2、假设美元与人民币的汇率是1美元兑换7.88人民币。编写程序输入人民币的钱数,输出能兑换的美元的金额。3、将距离从英里转换成公里。每英里等于5280英尺,1英尺等于12英寸,每英寸等于2.54厘米,每公里等于100,000厘米。putchar函数〔字符输出函数〕一般形式:putchar(字符表达式);功能: 向终端〔显示器〕输出一个字符〔可以是可显示的字符,也可以是控制字符或其它转义字符〕。例如: putchar(‘y’); put

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论