1、第二章第二章 数据类型、运算符和表达式数据类型、运算符和表达式v中的数据类型中的数据类型v算术运算符和算术表达式算术运算符和算术表达式v赋值运算符和赋值表达式赋值运算符和赋值表达式v逗号运算符及逗号表达式逗号运算符及逗号表达式 v逻辑运算符和逻辑表达式逻辑运算符和逻辑表达式本章提要:本章提要:1 1 中的数据类型中的数据类型v常量:在程常量:在程序运行过程中值不改变的量。序运行过程中值不改变的量。如如4、3、a v变量:值可以改变的量称为变量。每一个变量:值可以改变的量称为变量。每一个变量应对应一个名字,即变量应对应一个名字,即。vC C规定:标识符只能由规定:标识符只能由字母、数字和下划字母
2、、数字和下划线线三种字符组成,且第一个字符不能是数字。三种字符组成,且第一个字符不能是数字。一、常量与变量一、常量与变量|char 字符型:占用一个字节,只能存放一个字符|int 整型:占用两个字节,数的范围 3276832767|float 单精度浮点数:4 byte|double 双精度浮点数:8 byte二、二、C C中的基本数据类型中的基本数据类型|字符常量:用单引号引起来的字符。字符常量:用单引号引起来的字符。如如 aa、zz、SS等等z注意注意 :在:在C C中,中,aa与与aa是不同的是不同的|除了这种形式的字符常量外,除了这种形式的字符常量外,C C还有一还有一种特殊形式的字符
3、常量:以反斜杠种特殊形式的字符常量:以反斜杠为开头的字符序列,称之为为开头的字符序列,称之为“”。如前面接触的。如前面接触的nn。z说明说明 :其它的转义字符请参见教材其它的转义字符请参见教材1 1、字符型、字符型|字符变量字符变量:用:用charchar关健字定义的关健字定义的变量。如:变量。如:char c1,c2;char c1,c2;z说明说明:在字符变量中,只能存放一个字符,在字符变量中,只能存放一个字符,不能这样对字符变量赋值不能这样对字符变量赋值:c1=ab;或;或 c1=”a”而只能这样赋值:而只能这样赋值:c1=a;c1=a;|字符字符串:用双引号引起来的字符串:用双引号引起
4、来的字符如:如:“asdasd”、“hello”hello”1 1、字符型、字符型|字符在内存中的存储形式字符在内存中的存储形式 :字符在内存中是以一个字节字符在内存中是以一个字节的空间来存放这个字符的的空间来存放这个字符的ASCIIASCII码的,即,码的,即,字符在内存字符在内存中也是以数的形式存在的中也是以数的形式存在的。因此,可以对字符进行加、因此,可以对字符进行加、减等算术运算。减等算术运算。z例例:验证:验证字符在内存中的存储形式字符在内存中的存储形式1 1、字符型、字符型#includestdio#include.hvoid main()void main()char c1,c2
5、;char c1,c2;c1=a;c1=a;c2=d;c2=d;printfprintf(“%c,%dn%c,%dn”,c1,c1);,c1,c1);printfprintf(“%c,%dn%c,%dn”,c2,c2);,c2,c2);1 1、字符型、字符型|整常量:一般的十进制整数、整常量:一般的十进制整数、以以“”开头的进制整数,开头的进制整数,以以“”开头的开头的1616进制整进制整数。数。|整型变量:一般的整型变量整型变量:一般的整型变量为基本型,用为基本型,用intint关健字来定关健字来定义。一个义。一个intint型变量在内存中型变量在内存中占两个字节。占两个字节。2 2、整型、
6、整型|除基本型外,在除基本型外,在C C中还可以用中还可以用以下几种修饰符对以下几种修饰符对intint型数据型数据进行修饰,以扩大进行修饰,以扩大intint型数据型数据的范围:的范围:zlong long 长整型长整型 4 4 bytebytezshort short 短整型短整型 2 2bytebytezunsinged unsinged 无符号型无符号型 2 2bytebyte2 2、整型、整型|float:float:单精度浮点数,在内单精度浮点数,在内存中占存中占4 4个个bytebyte|double:double:双精度浮点数,在内双精度浮点数,在内存中占存中占8 8个个byt
7、ebyte3 3、实型、实型三、三、各类数据间的混合运算各类数据间的混合运算 通过前面的讲解,我们已经知道:通过前面的讲解,我们已经知道:字符型与整型在字符型与整型在C C中是通用的。而整型中是通用的。而整型与实型之间又都是数据型,因此,在与实型之间又都是数据型,因此,在C C中,整型、实型和字符型数据间可以进中,整型、实型和字符型数据间可以进行混合运算。在混合运算时不同的数据行混合运算。在混合运算时不同的数据先转换成同一类型,再进行运算。转换先转换成同一类型,再进行运算。转换规则如下图:规则如下图:三、三、各类数据间的混合运算各类数据间的混合运算 高 doublefloat long uns
8、igned低 int char,shortv注:纵向的箭头方向只表示级别高低,并不表示必须一级级按此转换。三、三、各类数据间的混合运算各类数据间的混合运算 例:例:10+a+i10+a+i*f-d/e f-d/e (i i为为intint型;型;f f为为floatfloat;d d为为doubledouble;e e为为floatfloat。1)10+a a97=10+97(int)2)i*f ifloat=(float)3)int+float intfloat=(float)4)d/e edouble=(double)5)float+double floatdouble=(double)结
9、论:运算的结果为混合运算的数据类型中最结论:运算的结果为混合运算的数据类型中最高的类型高的类型。2 2 算术运算符和算术表达式算术运算符和算术表达式 v+、-、*、/、%v%求余运算符。其结果为两数相除后所求余运算符。其结果为两数相除后所得余数,如得余数,如7%3=17%3=1。注:。注:本运算符要求两侧本运算符要求两侧均为均为intint型数据。型数据。1、基本的算术运算符|优先级优先级:如如 a+ba+b*c c|结合性结合性:当一个运算对象两侧的运当一个运算对象两侧的运算符的优先级别相同时,算符的优先级别相同时,C C规定了规定了各种运算符的结合方向,即各种运算符的结合方向,即“结结合性
10、合性”。如:如:a+b-ca+b-c;变量;变量b b两侧的运算符两侧的运算符优先级别相同,此时用到优先级别相同,此时用到“结合结合性性”的概念的概念。2 2、算术运算符的优先级和结合性|一般形式:一般形式:(类型名)(表达式)类型名)(表达式)|功能:功能:把一个表达式(变量)转换成把一个表达式(变量)转换成所需类型。所需类型。|例例:若有若有x=3.8;x=3.8;则则 (intint)x)x的值为的值为3 3|注注1 1:类型名应用()括起:类型名应用()括起。|注注2 2:强:强制类型转换只是生成一个中间制类型转换只是生成一个中间数据,而原有数据类型、值均不发生数据,而原有数据类型、值
11、均不发生变化变化。3 3、强制类型转换运算符强制类型转换运算符例:强制类型转换例:强制类型转换#includemain()float x=3.7,y=4.4,z;z=(int)(x+y);printf(“x=%f,y=%f,z=%dn”,x,y,z);3 3、强制类型转换运算符强制类型转换运算符|自增运算符为自增运算符为+,自减为,自减为-,作用分别是使,作用分别是使变量变量的值加的值加1 1或减或减1 1。具体使用时有以下两种。具体使用时有以下两种形式:形式:+i+i、-i(-i(使用使用i i之前,先使之前,先使i i的值加的值加1 1、减、减1)1)i+i+、i-(i-(先将先将i i的
12、值取出来使用,用后再使的值取出来使用,用后再使i i的值加的值加1 1、减、减1)1)|参看下例:若有定义参看下例:若有定义 intint i=10,j;i=10,j;执行执行 j=i+;/j=i+;/则则 j=10;i=11;j=10;i=11;=执行执行 j=+i;/j=+i;/则则 j=11;i=11;j=11;i=11;4 4、自增、自减运算符、自增、自减运算符|+,-只能用于变量而不能用于常量或表达只能用于变量而不能用于常量或表达式。如式。如5+5+,(a+b)+(a+b)+都是错误的。都是错误的。|+、-的结合方向为的结合方向为“自右向左自右向左”。若有语若有语句:句:-i+;-i
13、+;则相当于则相当于-(i+)-(i+);即对于语句:;即对于语句:printfprintf(“%d”,-i+);(“%d”,-i+);输出结果为:输出结果为:-3-3 而此时而此时i i的值为的值为4;4;|对于对于i=3,j=(i+)+(i+),ji=3,j=(i+)+(i+),j的值为的值为6 6。4 4、自增、自减运算符、自增、自减运算符 在使用在使用+、-运算符时,应注意以下运算符时,应注意以下三点:三点:void main()int i=3,j,k;k=(i+)+(i+)+(i+);printf(“k=%d,i=%d”,k,i);i=3;k=(+i)+(+i);printf(“k=
14、%d,i=%d”,k,i);i=3;k=(+i)+(i+);printf(“k=%d,i=%d”,k,i);i=3;j=10;k=i+j;printf(“k=%d,i=%d,j=%d”,k,i,j);4 4、自增、自减运算符、自增、自减运算符 3 3 赋值运算符和赋值表达式赋值运算符和赋值表达式v赋值时的类型转换:字符赋值时的类型转换:字符整型整型实型实型 v(对于占内存单元多的数据类型赋给少的对于占内存单元多的数据类型赋给少的时时,会截取会截取;少的给多的时少的给多的时,不变不变)v复合的赋值运算符:在复合的赋值运算符:在”=”号之前加上号之前加上其它运算符其它运算符,就可构成复合运算符。如
15、在就可构成复合运算符。如在”=”前加一个前加一个+”就构成了复合运算符就构成了复合运算符“+=”+=”。赋值运算符:赋值运算符:“=”=”,其作用是将一个数,其作用是将一个数据赋给一个变量据赋给一个变量 3 3赋值运算符和赋值表达式赋值运算符和赋值表达式v对于复合的赋值运算符对于复合的赋值运算符+=+=,可以这,可以这样理解:样理解:变量变量+=+=表达式表达式 变量变量=变量变量+(+(表达式表达式)v例如:例如:a+=3;a+=3;a=a+3;a=a+3;y+=y y+=y*8 8 y=y+(y y=y+(y*8)8)v其它的复合的赋值运算符,其理解方式其它的复合的赋值运算符,其理解方式与
16、与+=+=相类似:如相类似:如 a a*=a+3=a+3?v请考虑:若请考虑:若a=3a=3,则,则a+=aa+=a*=a/=a=a/=a的值的值3 3赋值运算符和赋值表达式赋值运算符和赋值表达式v赋值表达式:由赋值运算符将一个变量和一个赋值表达式:由赋值运算符将一个变量和一个表达或连接起来的式子。如表达或连接起来的式子。如“a=5”a=5”注意注意:赋值表达式不同于赋值语句赋值表达式不同于赋值语句。赋值语句的。赋值语句的后面有分号而赋值表达式没有。也就是说,给后面有分号而赋值表达式没有。也就是说,给一个赋值表达式未尾加上分号后,就构成了赋一个赋值表达式未尾加上分号后,就构成了赋值语句。值语句
17、。vC C中规定:赋值表达式是有值的,它的值就是被中规定:赋值表达式是有值的,它的值就是被赋值变量的值赋值变量的值。即表达式即表达式“a=5”a=5”的值为的值为5 5。由。由此又可赋值:此又可赋值:b=(a=5);b=(a=5);又如:又如:a=(b=4)+(c=5);a=(b=4)+(c=5);3 3赋值运算符和赋值表达式赋值运算符和赋值表达式1.a-=a+4a=a-(a+4)a=-42.a*=a a=a*aa=163.a+=a a=a+aa=32v现在我们来看刚才的那个例子:现在我们来看刚才的那个例子:若若a=3,a=3,则表达式则表达式a+=aa+=a*=a-=a+4=a-=a+4的值
18、?的值?4 4逗号运算符及逗号表达式逗号运算符及逗号表达式v逗号表达式的求解过程是:逗号表达式的求解过程是:先求解表达式先求解表达式1 1的值,再求解表达式的值,再求解表达式2 2的值,整个逗号表达的值,整个逗号表达式的值是表达式式的值是表达式2 2的值。的值。v如:若如:若a=3;a=3;则表达式则表达式v a a*=a+4,a=a+4,a*4 4 的值为的值为 2828*4 4用用,将两个表达式连接起来,称为逗号表将两个表达式连接起来,称为逗号表达式。如:达式。如:6+86+8,3+43+4。逗号表达式的一般形式:逗号表达式的一般形式:表达式表达式1 1,表达式,表达式2 2。4 4逗号运
19、算符及逗号表达式逗号运算符及逗号表达式v逗号表达式可扩展为逗号表达式可扩展为 表达式表达式1 1、表达式、表达式2 2、表达式表达式n n 它的值为表达式它的值为表达式n n的值。的值。v 逗号运算符是所有运算符中级别最低的。逗号运算符是所有运算符中级别最低的。因此,以下两个表达式:因此,以下两个表达式:1 1)x=(a=3,6x=(a=3,6*3)3)2)x=a=3,6 2)x=a=3,6*3 3 其意义是不同的。其意义是不同的。5关系运算符和关系表达式关系运算符和关系表达式v所谓的所谓的“关系运算关系运算”实际上就是比较运算,实际上就是比较运算,将两个值进行比较,判断比较的结果是否符将两个
20、值进行比较,判断比较的结果是否符合给定的条件。如合给定的条件。如“53”53”即为一个关系表达即为一个关系表达式。式。v在在C C中,关系运算符有中,关系运算符有,=,=,353的值为的值为1 1,535,=.,=.,关系运算符关系运算符 赋值运算符赋值运算符v使用关系运算符应注意的问题:使用关系运算符应注意的问题:1 1)abcabc 2)f=abc 2)f=abc (设设a=5,b=4,c=3)a=5,b=4,c=3)6 6 逻辑运算符和逻辑表达式逻辑运算符和逻辑表达式 vC C中的逻辑运算符为中的逻辑运算符为&(与与),),|(或或),),!(非非)。v逻辑表达式逻辑表达式:用逻辑运算符
21、将关系表达式用逻辑运算符将关系表达式或逻辑量连接起来或逻辑量连接起来,就是逻辑表达式就是逻辑表达式 v在其它的高级语言中,在其它的高级语言中,逻辑运算符的两边逻辑运算符的两边要求是逻辑值(如要求是逻辑值(如FoxFox中的中的.T.T.和和.F.)F.),但但C C中没有逻辑值中没有逻辑值。系统在进行逻辑运算时。系统在进行逻辑运算时,对对“0”0”处理为假处理为假,而而“非非0”0”即为即为“真真”,即所即所有的非零数值都作为真处理。有的非零数值都作为真处理。6 6 逻辑运算符和逻辑表达式逻辑运算符和逻辑表达式v因此因此,以下语句的执行结果可能与编程者以下语句的执行结果可能与编程者意图不符:意图不符:int a=5;if(a=4)printf(“a=4”);else printf(“a!=4”);v对于逻辑运算的结果对于逻辑运算的结果,不是不是0,0,就是就是1,1,而参而参加逻辑运算的运算对象则可以是任何数值。加逻辑运算的运算对象则可以是任何数值。如:如:53&2|83&2|8bm=ab)&(n=cd)&(n=cd)则则m=0,m=0,而后面的表达式而后面的表达式(n=cd)(n=cd)不被执行。不被执行。n n的值为?的值为?