资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,第三章 数据类型、运算符和表达式,词类之一 常量,词类之二 变量,词类之三 运算符,词类之四 表达式,各种词类的数据类型,3.1 C,语言的数据类型,数据类型,:是指数据在计算机中,存放的形式,。,不同类型的数据有不同的,加工方法,。,C,语言的数据类型分类,参看下表。,1,C,语言的数据类型表,带符号整型 (简称整型),带符号整型 带符号短整型(简称短整),带符号长整型(简称长整),整型 无符号整型 (简称无符号整型),无符号整型 无符号短整型(简称无符号短整),无符号长整型(简称无符号长整),基本类型 单精度型,实型,双精度型,字符型,数据类型 数组型(字符串型),构造类型 结构型,共用型,指针型,空类型,2,3.2,常量与变量,一、常量与符号常量,(,1,)常量 直接写在程序清单中的数据,分为整型、实型、字符型、字符串。,(,2,)符号常量 用名字来替代常量。,【,定义方法,】#define,符号常量名 常量,【,注,】,符号常量名:用户任取的一个标识符。,标识符 :字母开头的字母、数字、下划线等组成,长度,8,或,32,。,符号常量通常用大写字母组成,以便区别其他的对象,如变量名。,符号常量性质是常量,不能象变量那样给其赋新值。,二、变量,(1),变量 利用数据定义语句在程序中定义的对象,用来存放数据。,(2),变量名 标识符(通常用小写字母组成),在定义时确定的。,(3),变量值 变量中存放的数据,通过输入、初始化、赋值获得。,(4),变量数据类型 变量中能存放的数据类型,在定义时确定的。,【,注,】,变量名区分字母大小写的!如,ccw,、,Ccw,、,CCw,、,CCW,是不同变量名。,标识符不能是关键字(,C,语句中使用的英语单词),C,语言的关键字请参考附录,B,,,P365,(后续课程会一一介绍)。,3,3.3,整型数据,一、整型常量及其表示方法,【,表示方法,】,有,3,种。,十进制整数 通常形式的整数 例如,+12,、,-12,、,12,。,八进制整数,以,0,开头的八进制整数 例如,+012,、,-012,、,012,。,十六进制整数,以,0 x,开头的十六进制整数 例如,+0 x12,、,-0 x12,、,0 x12,。,二、整型变量,【,作用,】,存放整型数据。,【,定义方法,】,存储类型符,数据类型符 变量名,1,=,初值,变量名,2,=,初值,.,;,其中:方括号中内容是可以省略的,变量名是标识符,初值是常量或,常量表达式,。,数据类型符可以是下列任一种:,整型 短整型 长整型 无符号整型 无符号短整型 无符号长整型,类型符,int,short long unsigned,int,unsigned short unsigned long,字节数,4(2)2 4 4,(,2,),2 4,【,功能,】,定义某种数据类型的变量,,分配内存,,并赋予初值。,【,注,】,int,、,unsigned,int,在,VC,中为,4,字节,。,三、整型常量的数据类型,在,VC,中整型常量均为带符号长整型,【,注,】,在,VC,中整型常量后可以加字母,L,或,l,,如,1L,、,12000L,。,通用的数据定义语句,复习内存的概论,复习四种数制间的转换方法,4,3.4,浮点(实)型数据,一、浮点型常量的表示方法,【,表示方法,】(1),普通的十进制实数,带小数点。如,0.0,、,-123.,、,.456,(2),指数形式(在字母,E,或,e,的后面写上,10,的方次),如,12.3E3,、,1e-5,。,二、浮点型变量,【,定义方法,】,存储类型符,数据类型符 变量名,=,初值,.,;,其中:数据类型符 可以是下列任一种:,单精度浮点型,float,占,4,字节 范围:,10,-37,10,+38,(,7,位有效数字),双精度浮点型,double,占,8,字节 范围:,10,-307,10,+308,(,16,位有效数字),变量名 用户给出的标识符,初值是常量或常量表达式。,【,功能,】,定义某种数据类型的变量,并赋予初值。,【,注,】,浮点型常量不区分单、双精度。,赋值时有效数字超出将截去多余数字。,例如,赋予单精度实型变量时,,1234.56789,变成,1234.568,。,3.5,字符型数据,一、字符常量,【,表示方法,】,(1),可显示字符,。用单引号,(,),括住单个字符。,如,0,、,A,、,a,。,(2),所有字符(包括,不可显示字符,)。,用单引号括住“,转义字符”,常用转义字符参看右表。,n,t,v,b,r,a,ddd,xhh,回车换行符,Tab,符,垂直制表符,左退一格符,回车符,响铃符号,单引号,双引号,反斜杠,1,3,位,8,进制数,ddd,对应的,ASCII,字,符,1,2,位,16,进制数,hh,对应的,ASCII,字,符,通用的数据定义语句,5,二、字符型变量,【,定义方法,】,存储类型符,数据类型符 变量名,=,初值,.,;,其中:数据类型符只能是,char,,,占用的内存字节数是,1,。,变量名是标识符,初值是常量或常量表达式。,【,功能,】,定义字符型的变量,并赋予初值。,【,注,】,字符型数据在内存中实际存放的是对应字符的,ASCII,代码值(,0,127,)。,因此,字符型数据可以看成带符号或无符号的整型数据。,而整型数据只要不超出范围(,0,127,),也可以看成是字符型数据。,【,例,】#include,stdio.h,【,说明,】,整型、实型、字符型合称,数值型,void main(),int,i;char c=97;i=,A,;,printf(,%c,%dn,c,i,);/*,程序是正确的,输出结果是:,a,65*/,三、字符串常量(简称字符串),【,表示方法,】,双引号,(,),括住的若干个字符(包括转义字符)。,【,例,】,、,1,、,1.23,、,abc,、,n,、,nnxyz,。,【,注,】(1),字符串在内存的存放规则是:按顺序依次存放字符串中每个字符的,ASCII,代码值,最后自动存放一个“,0,”,,,其值为,0,,称为,字符串结束标记符,。,(2),字符串长度,字符串中的字符数目。,(3),字符串占用的内存字节数,字符串长度,1,。,(4),无字符的字符串称为,空字符串,,简称空串。空串长度为,0,,占用,1,个字节。,(5),字符串与字符常量是不同的。,a,和,a,是不同的数据类型,占用字节数不同。,(6)C,中没有字符串变量,是用字符型数组来存放的,以后介绍。,介绍常用字符,的,ASCII,代码,A,Z,、,a,z,、,0,9,通用的数据定义语句,6,3.6,变量赋初值,【,方法,】,在定义变量时,给出初值。,【,注,】,初值是常量或已经定义过的符号常量、或由它们组成的表达式,(,常量表达式,),,,其数据类型与变量的数据类型要一致。,【,例,】#define PI 3.14159,错误的,int,i=10,j=-6+1,k;,int,i=10,j=,i+1,;,float f=1.2345,s=0.0-0.1,x1,x2=PI+1;,float f=1.2345,s=,0.0-f,;,char c1=,a,c2=,A,+1,c3,;,char c1=,a,c2=,c1+1,;,3.7,各种基本数据类型的数据之间混合运算,【,规则,】double,float,横向:必定先转换,纵向:沿箭头按需要转换,表达式计算时,long,就长不就短,unsigned,int,short,、,char,【,例,】,设有定义:,char c=,1,;,int,i=2;long,L,=3L;float f=4.0;,计算“,c*,i/L+f,”,的过程是:,(1)c*i c,转换成,int,型,和,i,相乘,运算结果是,int,型,(2)(c*i)/L c*i,转换成,long,型,和,L,相除,运算结果是,long,型,(3)(c*,i/L)+f,(c*i/L),和,f,转换成,double,型,相加,运算结果是,double,型,最后对基本类型的数据给一个小结表。,此处用大写。,因为小写字母,l,和数字,1,相似。,7,基本数据类型的小结,数据类型,数据类型符,占用字节数,数值范围,整型,int,4(,或,2),同长整型,(,或短整型,),短整型,short,2,-32768(,-2,15,),+32767(,2,15,-1),长整型,Long,4,-2147483648(,-2,31,),+2147483647(,2,31,-1),无符号整型,unsigned,int,4(,或,2),同无符号长整型,(,或短整型,),无符号短整型,unsigned short,2,065535,(2,16,-1),无符号长整型,unsigned long,4,04294967295,(2,32,-1),单精度实型,float,4,-10,37,10,38,(,7,位有效数字),双精度实型,double,8,-10,307,10,308,(,16,位有效数字),字符型,char,1,0,+127(-128,+127),8,3.8,算术运算符与算术表达式,基本算术运算符,(+-+-,*/,%),一、,C,的运算符,算术运算符,增,1,减,1,运算符,(+-),关系运算符,(=.),指针运算符,(&*+-),注:掌握运算符必须掌握:运算符、对象数目、运算符的位置、对象的类型、,运算规则、运算结果的类型、,优先级、结合性。,9,二、算术运算符,【,说明,】,(,1,),优先级,:单目,双目 (,3,),模运算,结果符号与被除数相同。,*、,/,、,%,、例如,,28,10,8,(商为,2,),(,2,),除运算,的结果与除数、被除数的数据类型有关。,28,-10,8,(商为,-2,),两个都是整型,则为整除,只取商的整数部分。,-,28,10,-8,(商为,-2,),例如,,28/10,2,-,28,-10,-8,(商为,2,),28.0,/10=2.8,28/10.0=2.8,28.0/10.0=2.8,名称,对象数与位置,运算符,对象类型,运算规则,结果类型,结合性,取正,单目前缀,整型、,实型,或字符型,取原值,与运算对象的类型相同,(,就长不就短,),自右向左,取负,取负值,加,双目中缀,相加,自左向右,减,相减,乘,*,相乘,除,/,相除或整除,模,%,整型,或字符型,整除取余数,整型,10,三、强制运算符,【,优先级,】,单目算术、强制,双目算术,【,例,】,(float)(7%3),的结果是,1.000000 7,位有效数字,(double)(5/2),的结果是,2.000000000000000 16,位有效数字,(int)(3.7+2.2),的结果是,5,【,注,】,其后无括号,仅对第一个数据起作用,如,(int)3.7+2.2,的结果是,5.2,四、自增自减运算符,名称,对象数,与位置,运算符,对象类型,运算规则,结果类型,结合性,强制转换,单目前缀,(,类型符),(,表达式,),数值型,表达式值转换成指定的数据类型,类型符的数据类型,自右向左,名称,对象数,与位置,运算符,对象类型,运算规则,结果类型,结合性,增1,单目前缀,+,字符型,整型,等,变量,变量加,1,后再使用变量,同,运算对象的类型,自右向左,本身无,单目后缀,+,使用变量后变量再加,1,减1,单目前缀,-,变量减,1,后再使用变量,单目后缀,-,使用变量后变量再减,1,11,【,优先级,】+,、,-,、,单目算术、强制,双目算术,【,例,】#include,stdio.h,void main(),int,k=3;,printf(,%dn,+k,);,输出结果是,4,,,k,为,4,printf(,%dn,k,+);,输出结果是,4,,,k,为,5,【,注,】(1),注意理解后缀,+,、,-,的加减,1,的时间,。,i=3;k=i+;k,为,3,、,i,为,4,i=3;k=(i+)+(i+)+(i+)k=3+3+3=9,、,i=3+1+1+1=6,结论,:,后缀的,+,和,-,是所在的表达式全部计算结束后,再进行加减,1,的运算,。,(,2,)自左向右尽可能地选取多个运算符组成复合运算符。,k=1;k+k+k,相当于,(k+)+(k+)+k,,,结果是,3,,,k,为,3,。,(,3,),+,和,-,只能作用于变量,不能作用于表达式。,k=1;+k,相当,+(+k),,,其中,(+k),是正确的,但,+(+k),是错误的。,(,4,)注意,TC,中函数参数的计算顺序是自右向左的(,VC,中是自左向右,)。,k=1;,printf(,“,%d,%d,”,k,k,+);,输出结果是,2,,,1,(,VC,中是,1,,,1,)。,五、算术表达式,表达式,:用运算符将合适的运算对象连接起来的式子。,表达式值,:表达式的最终运算结果值。,表达式类型,(,两种分类,),:表达式值的数据类型、最后一个运算符的类型。,运算符的运算对象,:常量、变量、表达式,(,常量、变量看成表达式特例,),。,表达式运算的转换规则,:就长不就短。,算术表达式,:用算术运算符将合适的运算对象连接起来的式子。,12,3.9,赋值运算符与赋值表达式,一、赋值运算符,【,注,】(1),前一个运算对象只能是变量,后一个运算对象是表达式,(,或常量、变量,),。,(2),赋值时的转换规则是:,就左不就右,。,当字节数少的值赋予字节数多的变量时,不会出错;反之,可能会出错。,【,例,】,int,k;k=3.99;k,为,3,。,float f;f=3;f,为,3.000000,unsigned short u=65535;short k;k=u;k,为,-1,long L=32768,;,short s;s=L;s,为,-32768,名称,对象数与位置,运算符,对象类型,运算规则,结果类型,结合性,赋值,双目中缀,左边:,变量,右边:,表达式,任何基本类型,计算表达式值转换成变量的数据类型后赋予变量,变量的数据类型,自右向左,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,复习:带符号整数与无符号整数,13,二、复合赋值运算符,【,优先级,】,+,、,-,、,+,、,-,、强制,双目算术,赋值,就长不就短,转为双精度,所有赋值运算符的优先级相同。,【,注,】,后,5,个将在第,12,章“位运算”介绍。,右边表达式自动加圆括号。,【,例,】,int,k=3;k-=3;k,为,0,。,int,k=3;,float f=3.0;f*=3;f,为,9.000000 k*=,1+2,;,int,k=-5;k/=2;k,为,-2,相当于“,k=k*,(1+2),;”,long L=5,;,L%=8L;L,为,5L,名称,对象数,与位置,运算符,对象类型,运算规则,结果,类型,结合,性,加赋值,双目,中缀,+=,左边:变量,右边:表达式,任何基本类型,X+=Y,相当于,X=X+(Y),变量的数据类型,自右,向左,X-=Y,相当于,X=X-(Y),减,赋值,-=,X*=Y,相当于,X=X*(Y),乘,赋值,*,=,除,赋值,/=,X/=Y,相当于,X=X/(Y),模,赋值,%=,整型,X%=Y,相当于,X=X%(Y),位与,赋值,双目,中缀,&=,左边:变量,右边:表达式,整型,X&=Y,相当于,X=X&(Y),整型,X|=Y,相当于,X=X|(Y),位或,赋值,|=,位,按位加赋值,=,X=Y,相当于,X=X(Y),位,左移赋值,=,X=Y,相当于,X=X=,X=Y,相当于,X=X(Y),常见的警告型错误:,float f;f=1.0+2.0;,14,三、赋值表达式,赋值表达式:用赋值运算符连接变量和表达式组成的式子。,赋值表达式的值:赋予左边变量的值。,赋值表达式的类型:左边变量的数据类型。,【,注,】,(,1,)赋值表达式也是表达式,可以出现在赋值运算符的右边。,例如,,int,k1=1,k2=2,k3;k3=k2=k1=5;,k3=k2=k1=5,相当于,k3=(k2=(k1=5);,结果,k3,、,k2,、,k1,均为,5,。,注:定义变量时的初值只能是常量(或常量组成的表达式),下列定义语句是错误的:,int,k1=k2=k3=5;,(,2,)赋值运算符的左边只能是变量,不能是表达式。,例如,,int,k1=1,k2;k2=k1+2=3;,k2=k1+2=3,相当于,k2=(k1+2),=,3),,赋值运算符的左边是表达式。,【,例,】,int,a=2;,计算表达式“,a+=a-=a*a”,和变量,a,的值。,a+=a-=a*a,相当于,a+=(a-=a*a),。,先,算,a-=a*a,相当于,a=a-(a*a),表达式计算结果是,-2,a,是,-2,。,再算,a+=(-2),相当于,a=a+(-2),,表达式计算结果是,-4,a,是,-4,。,3.10,逗号运算符与逗号表达式,一、逗号运算符,运算符是“,”,;,双目中缀、运算对象是表达式。,运算规则是先计算左边的表达式,再计算右边的表达式。,运算结果是右边表达式的值;类型是右边表达式的数据类型。,结合性是自左向右的。,15,二、逗号表达式,逗号表达式:用逗号运算符连接两个表达式组成。,逗号表达式的值:右边表达式的值。,倒数第,2,逗号表达式的类型:右边表达式的数据类型。,倒数第,1,【,注,】,不是所有的逗号都是逗号运算符。,例如,,int,k=5,j=6;printf(,%d,%d,k,j+1);,【,说明,】,运算符的优先级:,+,、,-,、,+,、,-,、强制,双目算术,赋值,逗号,各种赋值运算符是同级的、多个逗号运算符也是同级的。,【,例,】3+5,4+2,3+1,逗号表达式值为,4,。,int,a,b,c;a=3,b=4,c=5,逗号表达式值为,5,,变量,a,、,b,、,c,值依次为,3,、,4,、,5,。,int,a,b,c;c=(a=3,b=4),赋值表达式值为,4,,变量,a,、,b,、,c,值依次为,3,、,4,、,4,。,int,x,a;x=(a=3,3*6),赋值表达式值为,18,,变量,a,、,x,值依次为,3,、,18,。,int,x,a;x=a=3,3*6;,逗号表达式值为,18,,变量,a,、,x,值均为,3,。,int,a=3,b=4,c=5;,printf(,%d,%d,%dn,a,b,c,);,输出结果是,3,4,5,printf(,%d,%d,%dn,(a,b,c),b,c,);,输出结果是,5,4,5,【,编程经验,】,不要自找麻烦,使用一些难以理解的表达式。,(1)int n=5,a=12;a%=(n%=2,),结果,n,为,1,、,a,为,0,、表达式为,0,。,(2)int a=16;a+=a-=a*=a,结果,a,为,0,、表达式为,0,。,16,第三章习题答疑(一),3.3,十进制带符号整数转换成八、十六进制整数。,通用验证程序清单如下:,#include,”,stdio.h,”,void main(),int,x=,?,;,printf(,”,%o,%,xn,”,x,x,);,/*,以八、十六进制输出*,/,其中:,?,是对应的带符号整数。,输出结果是,4,字节八进制整数 十六进制整数,17,3.7,字符加密(用后,4,个字母),提示:每个字母,+4,即是后,4,个字母,不能是,W,、,X,、,Y,、,Z,。,3.9,已知各变量的值,计算某个表达式的值。,通用验证程序清单如下:,#include,”,stdio.h,”,void main(),每次换成新表达式,?,xx;,xx=(,表达式,),;,/*,计算表达式值存入,xx*/,printf(,”,%,?,n,”,xx,);,其中:,?,表达式对应的数据类型符,(,需事先判断,),?,表达式为整型,则,?,为,int,?,为,d,表达式为实型,则,?,为,float,?,为,f,第三章习题答疑(二),18,3.10,写出程序运行的输出结果,上机验证。,(计算,4,个整型表达式值输出),3.12 a=12,n=5,。,计算某,表达式后,求变量,a,的值。,通用验证程序清单如下:,#include,”,stdio.h,”,void main(),short a=12,n=5;,表达式,;,printf(,”,%dn,”,a,);,其中:,表达式,每次换成新表达式,输出结果是变量,a,的值。,第三章习题答疑(三),19,
展开阅读全文