资源描述
,第二章,数据类型、运算符与表达式,什么是数据类型?,数据结构+算法=程序,C语言中以“数据类型”形式存在,对数据的描述,对操作的描述,2.1C语言的基本数据类型,C语言提供了以下一些数据类型。,数据类型,指针类型,空类型(无值类型)void,基本类型,概念:在程序运行过程中,其值不能被改变的量。在程序中以两种形式出现:直接常量(字面常量)和符号常量。,2.2.1整型常量(1)十进制整数。如:123,-456,4。045,12D(2)八进制整数。以0头的数是八进制数,通常是无符号数。如:0123,073,0101。017777。256,03A2(3)十六进制整数。以0 x开头的数是16进制数,通常是无符号数。如:0 x123,0 xffff。023,23D,2.2常量,两种表示形式,小数0.123指数3e-3,注意:字母e(或E)之前必须有数字,且e/E后面的指数必须为整数:,1e3、1.8e-3、-123e-6、-.1e-3e3、2.1e3.5、.e3、e,2.2.2实型常量,规范化的指数形式:在字母e(或E)之前的小数部分中,小数点左边应有一位(且只能有一位)非零的数字。例如:123.456可以表示为:123.456e0,12.3456e1,1.23456e2,0.123456e3,0.0123456e4,其中的1.23456e2称为“规范化的指数形式”。,2.2.3字符常量,(1)用单引号括起来的一个字符是字符型常量(2)只能包含一个字符,例,a,A,1abc、“a”,语言还允许使用一种特殊形式的字符常量,就是以反斜杠开头的转义字符。,例2.1转义字符的使用#includevoidmain()inta,b,c;a=1;b=2;c=3;printf(“%dnt%d%dn%d%dtb%dn”,a,b,c,a,b,c);,显示屏上的运行结果:123123,2.2.4字符串常量,字符串常量是一对双撇号括起来的字符序列合法的字符串常量:“Howdoyoudo.”,“CHINA”,“a”,“$123.45”可以输出一个字符串,如printf(“Howdoyoudo.”);,字符与字符串的区别有哪些?,2.2.5符号常量,用一个标识符代表一个常量。,格式:#define常量名字面常量举例:#definePRICE100#definePI3.14#defineC1a,习惯上常量名用大写,符号常量的定义放在函数外面。,例2.2符号常量的使用#definePRICE30#includevoidmain()intnum,total;num=10;total=num*PRICE;printf(total=%dn,total);,标识符就是一个名字,在程序执行过程中,可以改变的量称为变量。,1、标识符就是一个名字(如常量名、变量名、函数名)。2、组成:只能由字母、数字、下划线组成。且第一个字符必须为字母或下划线。例:sum,_total,month,Student_name,BASIC,li_lingM.D.John,¥123,3D64,ab3、C语言的关键字不能用作变量名。4、在选择变量名和其它标识符时,应注意做到“见名知意”,即选有含意的英文单词(或其缩写)作标识符。例如,name(姓名)、age(年龄)5、建议变量名的长度最好不要超过8个字符。,标识符,2.3变量,2.3.1整型变量,类型类型说明符长度数的范围基本型int2字节-3276832767短整型short2字节-215215-1长整型long4字节-231231-1无符号整型unsigned2字节065535无符号短整型unsignedshort2字节065535无符号长整型unsignedlong4字节0(232-1),1、整型变量的分类,2、整型变量的说明程序中用到的变量必须“先说明,后使用”。,变量说明的一般格式:类型说明符变量名,变量名,;例如:inta,b;(指定变量、为整型)unsignedshortc,d;(指定变量、为无符号短整型)longe,f;(指定变量、为长整型),3、整型常量的后缀,(1)一个整数,如果其值在-32768+32767范围内,认为它是int型。(2)一个整数,如果其值超过了上述范围,而在-2147483637+2147483647范围内,则认为它是为长整型。(3)一个整常量后面加一个字母u或U,认为是unsignedint型,如12345u。4)在一个整常量后面加一个字母l或L,则认为是longint型常量。例如:123l432L0L,2.3.2实型变量,类型位数数的范围有效数字float3210-37103867位double型6410-307103081516位longdouble12810-49311049321819位,1、实型变量的分类(单精度型、双精度型、长双精度型),2、实型变量的说明floata,b;(指定变量a,b为单精度型)doublec,d;(指定变量c,d为双精度型),3、实型常量的后缀实型常数,系统按双精度来处理,但如是在数的后面加字母f或F(如1.65f,64.87F),这样编译系统就会把它们按单精度处理。,例2.3float和double的应用#includevoidmain()floata;doubleb;a=5555.55555;b=5555.5555555555;printf(“%fn%f”,a,b);,2.3.3字符型变量字符型变量用来存放字符常量,注意只能放一个字符。字符变量的定义形式如下:charc1,c2;可以用下面语句对c1,c2赋值:c1a;c2b;一个字符变量在内存中占一个字节。,将一个字符常量放到一个字符变量中,实际上并不是把该字符本身放到内存单元中去,而是将该字符的相应的ASCII代码放到存储单元中。例:字符变量ch中存放字符a,其ASCII码为97,在内存中以二进制形式存放,其格式如下:,ch,01100001,注意:字符型数据与整型数据在存储方式上的相似性使得两者之间可以通用。一个字符数据既可以以字符形式输出,也可以以整数形式输出。但字符型数据的表示范围是:0255。,例2.4向字符变量赋以整数。#includevoidmain()charc1,c2;c1=97;c2=98;printf(“%c%cn”,c1,c2);printf(“%d%dn”,c1,c2);,说明:在第和第4行中,将整数和分别赋给c1和c2,它的作用相当于以下两个赋值语句:c1a;c2b;因为a和b的ASCII码为97和98,运行结果:9798,例2.5大小写字母的转换#includevoidmain()charc1,c2;c1=a;c2=b;c1=c1-32;c2=c2-32;printf(“cc,c1,c2);,说明:程序的作用是将两个小写字母a和b转换成大写字母A和B。从ASCII代码表中可以看到每一个小写字母比它相应的大写字母的ASCII码大。语言允许字符数据与整数直接进行算术运算。,运行结果:,2.4运算符与表达式,的运算符有以下几类:,2.4.1算术运算符和算术表达式1、算术运算符+(加法运算符,或正值运算符,如:、)-(减法运算符,或负值运算符,如:、)*(乘法运算符,如:*)/(除法运算符,如:)%(模运算符,或称求余运算符,如:的值为)+(自增运算符,如:i+、+i)-(自减运算符,如:i-,-i),双目运算符左结合,单目运算符右结合,自增、自减运算符作用是使变量的值增或减如:+i(在使用i之前,先使i的值加1)-i(在使用i之前,先使i的值减1)i+(在使用i之后,使i的值加1)i-(在使用i之后,使i的值减1),注意:两个整数相除的结果为整数,舍去小数部分。当商为负数时,多采用“向零取整”的方法。例:5/3=1-5/3=-1求余运算的两侧均应为整数例:5%3=2,例:假设i,j均已说明,且i=3;j=+i;i的值先变成4,再赋给j,j的值也为4j=i+;先将i的值3赋给j,j的值为3,然后i变为4,例2.7自增、自减运算符的应用#include“stdio.h”voidmain()inti,m,n,j,k;i=10;m=i+;n=+i;j=i-;k=-I;printf(“%d,%d,%d,%dn”,m,n,j,k);,2、算术表达式用算术运算符和括号将运算对象(也称操作数)连接起来的、符合语法规则的式子,称为算术表达式。运算对象包括常量、变量、函数等。例如:a*b/c-1.5a是一个合法的表达式。,2.4.2赋值运算符与赋值表达式,1、简单赋值运算符与赋值表达式赋值符号“=”就是赋值运算符,它的作用是将一个数据赋给一个变量。如“=”的作用是执行一次赋值操作(或称赋值运算)。把常量赋给变量。也可以将一个表达式的值赋给一个变量。如:b=4;a=b+3;由赋值运算符将一个变量和一个表达式连接起来的式子称为“赋值表达式”。一般形式为:例如:“5”是一个赋值表达式,2、变量赋初值,(1)语言允许在定义变量的同时使变量初始化。如:inta=3;/指定为整型变量,初值为floatf=3.56;/指定为浮点型变量,初值为3.56charc=a;/指定为字符变量,初值为a(2)可以使被定义的变量的一部分赋初值。如:inta,b,c=5;表示指定a、b、c为整型变量,但只对初始化,c的初值为。相当于:inta,b,c;c=5;(3)如果对几个变量赋以同一个初值,应写成:inta=3,b=3,c=3;表示a、b、c的初值都是。不能写成inta=b=c=3;,3、类型转换,赋值表达式要求左右两边的数据类型要相同,如果不一致,在赋值时要进行类型转换。包括自动转换和强制类型转换两种方法。,(1)自动类型转换,转换规则,若参与运算的运算量类型不同,则先转换成同一种类型,然后进行运算;转换按数据长度增加的方向进行,以保证精度不降低;所有实型运算都以双精度进行,即使仅含float型,也要先转换成double型,再运算。char和short型参与运算时,必须先转换为int型。在赋值运算中,赋值符号两边的数据类型不同时,把赋值号右边的类型自动换成左边变量的类型。,10+a+i*f-d/e,若inti;floatf;doubled;longe;i=2;f=2.5;d=3.9;e=3;下边表达式的值是多少?,?,例2.9自动转换类型的应用#include“stdio.h”voidmain()inta,b;floatx=23.54;charc1=d;a=x;b=c1;printf(“%d,%dn”,a,b);,(2)强制类型转换,可以利用强制类型转换运算符将一个表达式转换成所需类型。一般形式:()例如:(double)将转换成double类型(int)(x+y)将x+y的值转换成整型(float)(5%3)将5%3的值转换成float型,例2.10强制类型转换。#includevoidmain()floatx;inti;=3.6;i=(int)x;printf(x=%f,i=%dn,x,i);,运行结果:x3.600000,i=3,说明:有两种类型转换,一种是在运算时不必用户指定,系统自动进行的类型转换,如3+6.5。第二种是强制类型转换。当自动类型转换不能实现目的时,可以用强制类型转换。,4、复合赋值运算符及表达式,在赋值符“”之前加上其他运算符,可以构成复合赋值运算符。例如:a+=3等价于a=a+3x*=y+8等价于x=*(y+8)x%=3等价于x=x%3,以“”为例来说明,它相当于使进行一次自加()的操作。即先使加,再赋给。,注意:如果是包含若干项的表达式,则相当于它有括号。如:x%=y+3x%=(y+3)x=x%(y+3)(不要错写成x=x%y+3),5、对赋值表达式求解的过程求赋值运算符右侧的“表达式”的值;赋给赋值运算符左侧的变量。例如:赋值表达式“=3*5”的值为15,执行表达式后,变量a的值也是15。,赋值表达式中的“表达式”,又可以是一个赋值表达式。例如:a=(b=5)分析:请分析下面的赋值表达式(a=3*5)=4*3赋值表达式也可以包含复合的赋值运算符。如:a+=a-=a*a分析:若a的初值为12,则执行上述表达式后a=,?,能否写成:a=3*5=4*3,2.4.3逗号运算符与逗号表达式,逗号运算符:将两个或多个表达式连接起来,又称为“顺序求值运算符”。如:5,,逗号表达式的一般形式:表达式,表达式,表达式,表达式,求解过程:从表达式开始求解,逐个求解表达式、表达式3、表达式n;整个逗号表达式的值是表达式n的值。,逗号运算符是所有运算符中级别最低的。例:(1)*5,*(2)(*,*),a+5(3)(,*)(4),*3,注意:并不是任何地方出现的逗号都是作为逗号运算符。例如函数参数也是用逗号来间隔的。如:printf(“%d,%d,%d”,a,b,c);,2.4.5关系运算符和关系表达式,关系运算符及其优先次序(从左到右)(大于)=(大于或等于)=(等于)!=(不等于),优先级别:,如:ca+ba=bca=b(a+b)a=(bb+c,(a=3)(b=5),ab)(bb”的值为“真”,表达式的值为1。,已知:(a=3b=2c=1d=0),0,a=bc,d=ab+c,1,d=ab+c?,思考,C语言中没有专用的逻辑值,1代表真,0代表假,例2.13用C表达式描述下列条件(1)整数x为偶数;(2)整数m不是n的倍数;,X%2=0,m%n!=0,2.4.6逻辑运算符和逻辑表达式,1.逻辑运算符及其优先次序(1)scanf(%c,2.5位运算符与位运算,所谓位运算,就是参与运算的量按二进制进行运算。,语言提供的位运算符有:,运算符含义运算符含义按位与取反|按位或右移,(1)位运算符中除以外,均为双目(元)运算符,即要求两侧各有一个运算量。(2)运算量只能是整型或字符型的数据,不能为实型数据。,2.5.1按位与运算符,参加运算的两个数据,按二进制位进行“与”运算。如果两个相应的二进制位都为,则该位的结果值为;否则为。即:,,例:并不等于,应该是按位与运算:,注意:如果参加&运算的是负数(如-3&-5),则要以补码形式表示为二进制数,然后再按位进行“与”运算。,两个相应的二进制位中只要有一个为,该位的结果值为。即|,|,|,|,例:060|017,将八进制数60与八进制数17进行按位或运算。,2.5.2按位或运算符|,异或运算符也称XOR运算符。它的规则是:若参加运算的两个二进制位同号则结果为(假)异号则结果为(真)即:00=0,01=1,10=1,11=0,即:071052=023(八进制数),例:,2.5.3按位异或运算符,是一个单目(元)运算符,用来对一个二进制数按位取反,即将0变1,将1变0。例如,025是对八进制数25(即二进制数00010101)按位求反。,2.5.4取反运算符,左移运算符是用来将一个数的各二进制位全部左移若干位。,例如:a=2将a的二进制数左移2位,右补0。若,即二进制数00001111,左移位得00111100,(十进制数60),高位左移后溢出,舍弃。,2.5.5左移运算符2=00000011,2.5.6右移运算符,右移运算符是用来将一个数的各二进制位全部右移若干位。如:a2表示将a的各二进制位右移2位,移到右端的低位被舍弃,对无符号数,高位补0。,2.5.7位运算符的优先级,1、符合赋值运算符=,,2、位运算符的优先级算术运算符关系运算符&,|&|赋值运算符,
展开阅读全文