《第3章数据类型、运算与表达式.ppt》由会员分享,可在线阅读,更多相关《第3章数据类型、运算与表达式.ppt(70页珍藏版)》请在三一办公上搜索。
1、1,第三章 数据类型、运算符和表达式Chapter ThreeVariables,Data Types,and Arithmetic Expressions,2,3.1 C语言数据类型,单精度型float(single precision)双精度型(double precision),基本类型Basic Type,构造类型conformation,指针类型(Pointer)空类型(Dummy),数据类型Data Type,整型(integer)字符型(character),实型(浮点型)(Real)枚举类型(enumeration),数组(Array)结构体类型(Structure)共用体类型
2、(Union),3,C字符集,4,C字符集(续),5,C字符集(续),6,3.2.1常量(Constant)1.定义:在程序执行期间,其值不发生变化的量称为常量2.类型:直接常量(Direct)又称字面常量。分为整型常量:123,-321,0,654321,+78实型常量:2.68,3.14,2.718,1.38e12单字符常量:a,C,z字符串常量:”china”,”student”,”class number”,3.2 常量与变量(Constant and Variable),7,3.2 常量与变量(Constant and Variable),符号常量(Symbol)即用一个符号代表一个
3、常量 例如:#define PI 3.1415926/预处理命令 main()float r,l,s;r=2;l=2*PI*r;s=PI*r*r;printf(“l=%d,s=%d”,l,s);编译器编译后,程序中的有关代码变成了(.obj文件,不可见)l=2*3.1415926*r;s=3.1415926*r*r;,8,说明:,符号常量必须先定义后才能用它表示一个数值。符号常量的值在其作用域内不能改变,也不能被再赋值。符号常量名习惯用大写字母表示。,9,3.2.2 变量,1.定义:程序执行期间值可以改变的量。2.命名规则:变量名由标识符表示,只能由字母、数字和下划线三种字符组成,且第一个字符
4、不得为数字。例如:下列标识符中,不合法的变量名有:M.D.John,12%gf,1add,age(每个双精度变量分配 8字节存储单元),3,a,10,在C语言中,变量之所以要强制定义,其目的:1、避免在使用时输错:int student;stadent=30;。2、每一个变量被指定为一确定的类型,在编译时就能为 其分配相应的存储单元。3、指定每一个变量为一确定的类型,在编译时据此检查 该变量所进行的运算是否合法。例如:如果有double x,y;int z;对于运算:z=x*y;在编译时系统就会提示该运算类型不匹配:warning C4244:=:conversion from double
5、to int,possible loss of data,11,选变量名时,要做到“见名知意”例如:name student_num max class sum大小写字母是两种不同的字符,C变量名习惯用小写字母表示。变量名的长度因系统而异。当用TC编译系统时,不要超过8个字符,而用Visual C+编译系统时,几乎无限制。,请 注 意,12,3.3整型数据,3.3.1整型常量的表示法十进制整数:由数字(0-9)和正负号表示 例如:123、-456、0 等八进制整数:以0开头 例如:037,0,0435,0551,0123 即(123)8=(83)10(123)8=182+2 81+3 80=(
6、83)10十六进制整数:以0 x或0X开头 例如:0X2,0 x9F,0Xbcd,0X 0 x123 即(123)16=(291)10-0 x12 即(-12)16=(-18)10,13,3.3.2 整型变量整型数据在内存中的存放形式(补码表示法:便于加减运算)int i;i=10;10=(1010)2,余数,首位,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,1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 0,10的原码,取反,再加1,得-10的补码,10的表示法,正数的补码等于它的原码,-10的表
7、示,2,10,2,5,2,2,1,020121022123,14,计算10-10:10-10=10+(-10),0,=,10,-10,+,15,2 整型变量的分类,基本型(16位):以 int 表示(-3276832767)短整型(16位):以short int或short表示 1.类型 长整型(32位):以long int或long表示(-2.1E9L2.1E9L)无符号基本型(unsigned int)无符号型 无符号短整型(unsigned short)无符号长整型(unsigned long),一个无符号整型变量中可以存放的正数的范围比一般整型变量中正数的范围扩大一倍。unsigned
8、 int b;/*变量b的数值范围:065535*/,整型变量的字长short型2个字节byte(字长16位bit)int 型一般是2个字节long 型4个字节(字长32位)C要求 short型数据长度短于int型,int型短于long型。(short=int=long)long 型可以得到大范围的数据(-20亿20亿),但同时会降低运算速度,因此除非不得已,不要大量使用long型变量。,16,17,整型数据的溢出:main()int a,b;a=32767;b=a+1;printf(“%d,%d”,a,b);运行结果:32767,-32768改进:将变量a和b改成long型,并按%ld 格式
9、输出。但有时,系统(例如Visual C+)自动将int型变量(16位)扩展为long型变量(32位),18,整型数据的数据范围请看“ANSI标准定义的整数类型”(P43表)。注意:1、在一个整数常量后面加一个字母l或L,则认为是long 型常量。例如123456789l,9876543L 2、在一个整数常量后面加一个字母u或U,则认为是unsigned int 型常量。例如 56789U,56789u,19,3.4实型数据(Real Data),3.4.1实型常量表示形式有如下两种:十进制数形式:由数字和小数点及正负号组成。(注意:必须有小数点)例如:23.678,0.0083,-0.75,
10、435.36,+247.00也可能忽略小数点前面或者后面的数字215.,.95,-.71,+.5,.678 23.指数形式:由数字、小数点、字母e或E及正负号组成。(注:e或E之前必须有数字,其后指数必须为整数)例如:3.5E-5(3.510-5)2e3(2103)错误:E2,3.6e3.5,.e6,e,20,3.4.2 实型变量实型变量可分为:单精度(float型)如:float x,y;双精度型(double型)如:double a,b,c;说明:1.float 型变量用于存储单精度实数,在内存中占4个字节(bytes)或32 位(bits),提供67位有效数字。2.double 型变量用
11、于存储双精度实数,在内存中占8个字节(bytes)或64位(bits),提供1516位有效数字。,21,实数的存储方式与整形数据不同:符号 小数部分 指数部分 3.14159*10255对于float型10进制数,一些编译系统以24位表示小数部分,8位表示指数部分。3.一个实型常量不分float 和 double 型,一个实型常量可以赋给一个float 型或 double 型变量,并根据变量的类型截取实型常量中相应的有效位数字。,+.3 1 4 1 5 9 0 1 1 1 1 1 1 1,22,例如:main()float a,c;double b;a=123456789012345.6789
12、;b=123456789012345.6789;c=a+20;printf(“a=%fnb=%fnc=%fn”,a,b,c);输出结果:a=123456788103168.000000b=123456789012345.670000c=123456788103188.000000(避免将一个很大的数与一个很小的数相加减,以免出现舍入误差),23,3.5字符型数据(Character Data),3.5.1字符常量(Character Constant)1.用单引号括起来的一个字符 如 T,7,!2.转义字符:是一种特殊的字符常量,由反斜杠 和一个字符组成,其作用是用 将后面的字符转变为另外的意
13、义。如n 中的n 不表示字母n,而表示“换行”的意思。这是一种控制字符。,24,例如:字符含义 n 换行 t 横向跳格(水平制表符)b 退格v 竖向跳格(垂直制表符)r 回车 f 走纸换页 a 报警声 0 空字符 反斜线 单引号”双引号,25,说明:1、”ddd”与”xhh”分别表示用八进制数或十六进制数表示一个字符。例:101代表ASCII码(十进制)为65的字符A.系统中所有字符都有ASCII值(见374页)2、由于”在C语言中都有了特殊的意义,故要想在字符串中使用它们,须在其前面再加上一个反斜线。“;“;“例如,Tom said to the waiter:”Id like a cup
14、of coffee”.printf(“Tom said to the waiter:”Id like a cup of coffee”.”);3、除了前面介绍的特殊转义字符外,字母 代表字母本身。如c 代表字母 c。,26,3.5.2字符变量(Character Variable),定义形式:char 标识符1,标识符2,标识符n 例如:char c1,c2,c3,ch;c1=a;c2=b;c3=c;ch=d;说明:1、字符变量只能存储一个字符,在内存中占一个字节。2、在内存中,是把字符对应的ASCII码值放到存储单元中(0255)。3、字符型数据与整型数据之间可以通用。,27,main()c
15、har c1,c2;c1=97;/数字赋值给字符变量 c2=98;printf(“%c%cn”,c1,c2);printf(“%d%dn”,c1,c2);输出结果:a b97 98,main()int i;char c;i=a;/字符赋值给整型变量 c=97;/数字赋值给字符变量 printf(“%c,%dn”,c,c);printf(“%c,%dn”,i,i);输出结果:a,97a,97,28,3.5.4字符串常量(Character string constant),1.定义:括在一对双引号“”之内的字符序列或转义字符序列称为字符串常量。例如:“How are you!”“a”“*abcn
16、t”2.存储:字符串中的字符依次存储在内存中一块连续的区域内,并且把空操作字符 0自动附加到字符串的尾部作为字符串的结束标志。故字符个数为n的字符串在内存中应占n+1个字节。例:char c6=“china”;char*s=“china”;,29,b 与B是否相同?b 与“b”是否相同?,b为98,B为66b是字符常量,占据个1字节;b是字符串常量,占据个2字节,98,98 0,b 0,30,3.6变量赋初值(Variable initialization),1.初始化:在定义变量的同时为变量赋初值2.形式:类型标识符 变量名=常量或常量表达式 例如:int x=10;double sum=0
17、.;char ch=a;变量赋初值允许使用符号常量例如:#define PI 3.1415926.float x=PI;.可对被定义的变量的一部分赋初值 例如:int a,b,c=1,d=2;float r=2,l,s;可对几个变量赋以同一个初值 例如:int a=6,b=6,c=6;或可写为:int a=b=c=6;,31,数据类型的尺寸和范围,3.7 各类数值型数据间的混合运算,32,double(8 bytes)float(4 bytes)long int(4 bytes)unsigned int(4 bytes)int(2 bytes)char,short(1 bytes),形式:隐式
18、转换(由系统自动进行)显式转换(强制类型转换)隐式转换的转换规则:先自动转换成同类型数据,再进行运算。规则是低字长类型转换成高字长类型。,33,3.7各类数值型数据间的混合运算,(1)箭头表示当运算对象类型不同时的转换方向,一般是从低精度的类型转换到高精度的类型。(2)向左的横向箭头表示即使在同一种数据类型间进行运算时也要进行转换,用于提高精度。即:同为float 型数据的运算,一律转换成double 型数据后进行;同为char 和short int 型数据的运算,一律转换成 int 型的数据后进行。,double(8 bytes)float(4 bytes)long int(4 bytes)
19、unsigned int(4 bytes)int(2 bytes)char,short(1 bytes),34,34,3.7各类数值型数据间的混合运算,(3)当运算对象具有相同类型时,向上的箭头不再起作用。即:int型与int 型数据运算的结果仍为int 型;unsigned型与unsigned型数据运算的结果仍为unsigned型;long型与long 型数据运算的结果仍为long 型。,double(8 bytes)float(4 bytes)long int(4 bytes)unsigned int(4 bytes)int(2 bytes)char,short(1 bytes),35,c
20、har-char=int-int=chard-a=100-97=003=float+float=double+double=double int/float=float/float=floatfloat a;a=1/3.0=1.0/3.0=0.3333333double c;c=1.0/3.0=0.3333333333333333int b;b=1/3.0=1.0/3.0=0.3333333=0int/int=intfloat a;a=1/3=0.0;int b;b=1/3=0;,Decision loss,36,例:若有:int i;float f;double d;long e;试判断表达
21、式 3+b+i*f-d/e 的类型 int float float double double例:如果int a=5,b=2;double x;x=a/b;printf(“x=%f“,x);输出结果是什么?,X=2.000000,37,C语言使用的基本表达式有:赋值表达式,如:a=3 算术表达式,如:3+4*2 关系表达式,如:32,a=b,c!=0 逻辑表达式,如:35&a=b 条件表达式,如:ab?a:b 逗号表达式,如:a=3,b=4,c=5,38,3.8算术运算符和算术表达式(Arithmetic Operators and Expressions),1、基本的算术运算符:+-*/%整
22、型数运算int a=14,b=4;a-b=10a+b=18a*b=56a/b=3(decimal part truncated)a%b=2(reminder of division)-14%3=-2,39,实型数运算float x,y,z;x=6.0/7.0=0.857143y=1.0/3.0=0.333333z=-2.0/3.0=-0.666667%operator can not be used here混合运算15/10.0=1.515/10=1,40,说明:()上述运算符均为双目运算符(即有两个操作数two operands)(2)“”运算中,若操作数均为整数,则执行整除运算,舍去小数
23、部分。例如:5/3=1(3)“”要求两侧均为整数,“”运算不能用于float 和 double型数据例如:2,41,2、算术表达式和运算符的优先级与结合性(Priority and Combination,附录III),(1)算术表达式:用算术运算符和括号将操作数连接起来的,符合语法规则的式子。例如:a+b+a*b/c+2.8(2)优先级:高于(3)结合性:“自左至右的结合方向”例如:a-b+c,42,说明:()表达式应用括号括起例如:(int)(x+y);()在强制类型转换时,得到一个所需类型的中间变量,原来变量类型未发生变化。(3)用途:完成某种运算,如(int)5.5%3;在函数调用时使
24、实参与形参一致。,3、强制类型转换(Forced type transformation)形式:(类型名)(表达式)例如:(double)(a+b),43,举例作用x=(int)7.57.5 通过截尾转换为整数a=(int)21.3/(int)4.5转换为21/4,结果为5b=(double)sum/n以浮点数(实型数)模式计算除法y=(int)(a+b)将表达式a+b转换为整数z=(int)a+b将a转换为整数然后与b相加p=cos(double)x)在使用 x之前,将其转换为实型数,44,44,main()float x;int i;x=3.6;i=(int)x;printf(“x=%f,
25、i=%d”,x,i);,输出结果:x=3.600000,i=3,注意:强制类型转换后并不改变原来变量的类型 请看下面程序段:,45,4、自增、自减运算符(、),作用:使变量的值增或减,如:i+,+i等于i=i+1i-,-i等于i=i-1+i,-i 先执行i=i+1(i=i-1),再使用i的值 i+,i-先使用i的值,再执行i=i+1(i=i-1),举例:int j,i=3;j=+i;/*j的值为4,i为4*/j=i+;/*j的值为3,然后i的值变为4*/j=-i+;/*j的值-3,然后i的值变为4*/,46,说明:(1)为单目运算符(2)+、只能用于变量,而不能用于常量或表达式。例如:,(x+
26、y)+,+a,b+中合法的为:(3)自增、自减运算符为右结合性(即自右至左)。例如:a+(a+)错误的结合(-a)+y*x+y*(x+)错误的结合(y*x)+,4、自增、自减运算符(、),47,练习题,设a=2,则执行语句 k=+a+a+后的 k值为多少?(k=6,a=4)int i=3;a=(i+)+(i+)+(i+)?int i=3;printf(“%d,%d”,i,i+)?P58最好写成i=3;j=i+;printf(“%d,%d”,i,j)?,请避免这种写法,48,3.9 赋值运算符和赋值表达式Assignment Operator and Expressions,1、赋值运算符(=)
27、形式:变量名=常量或表达式作用:将右边常量或表达式的值赋给左边的变量例如:b=c+d;,要求:如果表达式类型与左边的变量的类型不 匹配,自动进行类型转换。,49,2、类型转换的原则,(1)将实型数据赋给整型变量时,舍弃实数的小数部分。如:若a为int型变量,执行a=3.56后,则a=3(2)将整型数据赋给实型数据时,数值不变,但以浮点形式存储到变量中。如:若b为float型变量,执行b=35后,则b为35.00000(3)整型数据赋给字符型变量时,只将低8位原封不动地送到字符变量中(即截断)。,0010 0001,0000 0001 0010 0001,如:,i=289=256+33,c=33
28、 c=!,50,(4)字符型数据赋给整型变量时,将字符数据(8位)放到整型变量低8位中。高8位则需要依据“符号扩展”来决定。,51,(5)将带符号数据赋给长度相同的无符号型变量,原样照赋。(6)double 赋给 float 时,截取前面7位有效数字。,52,53,54,P66(3.11)写出下面赋值的结果。格中写了数值的是要将它赋给其它类型的变量,将所有空格添上赋值后的数值。,int 9 9 100 76 53 68 42-1,char c d L 5 D*X,unsigned int 99 100 76 53 68 42 65535,float 99.000000 100.000000 7
29、6.000000 53.65 68.000000 42.000000 65535.000000,long int 99 100 76 53 68 42 65535,55,总的结论:低精度的数据赋值给高精度的变量,其精度将保持;高精度的数据赋值给低精度的变量,其精度将降低,有时甚至可能出错。,56,3、复合赋值运算符(Compound assignment operators)复合赋值运算符:在赋值符“=”之前加上其它运算符共有10种复合赋值运算符+=,-=,&,=,|=(位运算)例如:a+=3 a=a+3 x*=y+3 x=x*(y+3)x/=y x=x/y,57,普通赋值运算符简洁赋值运算符
30、a=a+3 a+=3a=a-3 a-=3a=a*(n+1)a*=n+1a=a/(n+1)a/=n+1a=a%ba%=ba=b=c=6a=(b=4)+(c=6)a=(b=4)*(c=6),58,4、赋值表达式(Assignment expressions)定义:由赋值运算符将一个变量和一个表达式连接起来的式子。形式:变量=表达式结合方向:由右向左说明:赋值表达式的值为被赋值的变量的值。其中“表达式”又可以是一个赋值表达式。例如:a=b=c=6 a=(b=4)+(c=6)a=(b=4)*(c=6)x=-b/(2*a)y1=-x+(dt=sqrt(b*b-4*a*c)y2=-x-dt,59,练习:写
31、出顺序执行下列表达式运算后的x值:1.x=a=b=10 2.x=25%(c=3),X=10,X=1,赋值表达式中可以包含复合赋值运算符 例如:若a=12,计算表达式a+=a=a*a运算后a的值 第一步:aa*a a=a-a*a=12-12*12=-132 第二步:a+=-132 a=a+(-132)=-264错误理解:a=a+(a=a*a)=a+a-a*a=-120,60,3.10 逗号运算符和逗号表达式,1.逗号运算符:即“,”优先级:为所有运算符中级别最低的。2.逗号表达式形式:表达式1,表达式2,表达式n求解过程:顺次求解表达式1,表达式2,最后求解表达式n,逗号表达式的值为表达式n的值
32、。例如:a=3*5,a*4 a=3*5,a*4,a+5 x=(a=4%3,a+1,a*10)a=2,b=3,c=4;,602010,61,例如:v=(x=10,y=5,x+y);The value of v is 15.应用:1)在for循环中:for(n=1,m=10;n=m;n+,m+)2)在while循环中:while(c=getchar(),c!=0)3)数值交换:t=x,x=y,y=t;,要牢记,不要使用关键词或者系统库函数的名字作为标识符(变量名或函数名);不要使用只差一、两个字符的变量名;每个变量要在程序或函数开始处声明其类型;在程序中被使用前,所有变量必须赋值;不要在#defi
33、ne命令的结尾处加“;”;不要在#和define之间加空格;C对于数据的溢出不给任何警告或指示,只会给出错误的结果。必须小心定义数据的类型;,62,要牢记,小心使用自增和自减运算符,在使用前了解前置(如+i)和后置(如i+)的差别;在计算顺序混乱的地方,小括号的使用可使它们变清晰;在赋值以前,表达式的类型被转换成与等号左边的变量类型一致。注意转换时可能的数据损失;所有的数学函数的参数(自变量)和返回值(计算值)均为double类型(例如y=sin(x)中的x和y);不要对浮点数变量使用自增和自减运算符。,63,64,第三章 作业(所有程序均需上机调试,正确后方能提交)3_1 判断以下程序段有否
34、错误,写出正确的程序段,并上机调试验证你的程序。(提交修改后的源程序)#include;void main()float x=3.1415;int y,z,student_num=196;PRINTF(“Hello!n”);printf(“the student_number is:d%n”,num);printf(“the student_number is:%Dn”,student_num);printf(“x=%dn”,x);printf(“y=%fn”,y);z=3/2;printf(“z=%dn”,z);/说明:”%d”是输入、输出整形数据的格式,”%f”是输入、输出实形数据的格式,
35、”n”是换行的格式,65,3_2 在计算机屏幕上输出一段文字:John said to his brother:(换行)(空两格)”Lets have a rest!”并在此段文字前后各空两行。(提交源程序)3_3 习题3.9,先写出运行结果,然后编制程序验证之。(提交源程序)3_4 习题3.10,先写出运行结果,然后编制程序验证之。3_5 习题3.12,先写出运行结果,然后编制程序验证之。(提交源程序,注意每次计算之前,将a的值复原为12),66,3_6.判断下列陈述是对还是错?,所有运算符具有相同的优先级.求模运算符%只能用于整型数运算符=和!=具有相同的优先级.在 C中,如果一个数据项为
36、零,它就被认为是逻辑假.表达式!(xy等效一个一元表达式由一个没有运算符的操作数组成.结合性被用来决定具有几个表达式的运算哪个优先执行.表达式语句用句点“.”结尾对于混合表达式运算,隐式类型转换是自动进行的强制类型转换可以用于改变表达式小括号可以用于改变表达式,以下为自我测试题,做完之后自己对答案,67,3_7.下列哪些表达式是有效的?如果有效,给出表达式的值;否则说明原因.a)25/3%2b)+9/4+5c)7.5%3d)14%3+7%2e)-14%3 f)15.25+-5.0 g)(5/3)*3+5%3h)21%(int)4.5,68,3_8.假设有:int a=10,b=20,c;判断下
37、列表达式是对还是错.a)语句a=+10,是有效的;b)表达式a+4/6*6/2 的值为11;c)表达式b+3/2*2/3的值为20;d)语句a+=b;将30赋给a,将20赋给b;e)语句+a+;运算的结果为a=12;f)语句a/=b;将值0.5赋给a;3_9.找出下列运算式中不必要的小括号,给出其精炼的表达式(x-(y/5)+z)%8)+25(x-y)*p)+q(m*n)+(-x/y)x/(3*y),69,答案,3_1 ErrorCorrectSentence1:;(no semicolon sign)Sentence4:PRINTFprintfSentence5:d%dSentence6:%
38、D%dSentence7:实型数用整型格式输出,错误Sentence8:整型数用实型格式输出,错误Sentence9:两个整数相除得到整数,小数部分被截尾Sentence10:实数的小数部分被截尾,精度降低3_6.a)Falseb)Truec)Trued)Truee)Truef)Falseg)Trueh)Falsei)Truej)Truek)True,70,3_7.a)0b)7c)无效,实数不能用%运算d)3e)-2f)无效,-5.0 应该有小括号g)5h)13_8.a)Trueb)Falsec)Trued)Falsee)Truef)False3_9.a)(x-y/5+z)%8+25b)(x-y)*p+qc)m*n-x/yd)x/(3*y),