*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,第,2,章 数据类型、运算符与表达式,2.1,程序设计概述,2.2 C,语言的数据类型,2.3,常量和变量,2.4,整型数据,2.5,实型数据,2.6,字符型数据,2.7,算术运算与算术表达式,2.8,赋值运算与赋值表达式,2.9 C,语言特有的运算和运算符,Return,2.1,程序设计概述,一个程序应包括对数据的描述和对数据处理的描述。,1,对数据的描述,即数据结构。数据结构是计算机学科的核心课程之一,有许多专门著作论述,本课程就不再赘述。在,C,语言中,系统提供的数据结构,是以数据类型的形式出现的。,2,对数据处理的描述,即计算机算法。算法是为解决一个问题而采取的方法和步骤,是程序的灵魂。为此,著名计算机科学家沃思(,Nikiklaus Wirth,)提出一个公式:,数据结构,+,算法,=,程序,实际上,一个程序除了数据结构和算法外,还必须使用一种计算机语言,并采用结构化方法来表示。,Return,2.2 C,语言的数据类型,C,语言提供的数据结构,是以数据类型形式出现的。具体分类如下:,1.,基本类型,分为整型、实型(又称浮点型)、字符型和枚举型四种。,2.,构造类型,分为数组类型、结构类型和共用类型三种。,3.,指针类型。在第,9,章中介绍。,4.,空类型,C,语言中的数据,有常量和变量之分,它们分别属于上述这些类型。,本章将介绍基本类型中的整型、实型和字符型三种数据。,Return,2.3,常量和变量,2.3.1,常量,1.,常量的概念 在程序运行过程中,其值不能被改变的量称为常量。,2.,常量的分类 (,1,)整型常量,(,2,)实型常量,(,3,)字符常量。,(,4,)符号常量。,常量的类型,可通过书写形式来判别。,2.3.2,变量,1.,变量的概念,在程序运行过程中,其值可以被改变的量称为变量。,2.,变量的两个要素,(,1,)变量名。每个变量都必须有一个名字变量名,变量命名遵循标识符命名规则。,(,2,)变量值。在程序运行过程中,变量值存储在内存中。在程序中,通过变量名来引用变量的值。,.,标识符命名规则,(,1,)有效字符:只能由字母、数字和下划线组成,且以字母或下划线开头。,(,2,)有效长度:随系统而异,但至少前个字符有效。如果超长,则超长部分被舍弃。,例如,由于,student_name,和,student_number,的前个字符相同,有的系统认为这两个变量,是一回事而不加区别。,在,TC V2.0,中,变量名(标识符)的有效长度为个字符,缺省值为。,(,3,),C,语言的关键字不能用作变量名。,注意,:,C,语言对英文字母的大小敏感,即同一字母的大小写,被认为是两个不同的字符。,习惯上,变量名和函数名中的英文字母用小写,以增加可读性。,思考题,:在,C,语言中,变量名,total,与变量名,TOTAL,、,ToTaL,、,tOtAl,等是同一个变量吗?,标识符命名的良好习惯见名知意,:,所谓“见名知意”是指,通过变量名就知道变量值的含义。通常应选择能表示数据含义的英文单词(或缩写)作变量名,或汉语拼音字头作变量名。,例如,,name/xm,(姓名)、,sex/xb,(性别)、,age/nl,(年龄)、,salary/gz,(工资)。,4.,变量的定义与初始化,在语言中,要求对所有用到的变量,必须先定义、后使用;且称在定义变量的同时进行赋初值的操作为变量初始化。,(,1,)变量定义的一般格式,存储类型,数据类型 变量名,变量名,2;,例如,,float radius,length,area;,(,2,)变量初始化的一般格式,存储类型,数据类型 变量名,=,初值,变量名,2=,初值,2;,例如,,float radius=2.5,length,area;,Return,2.4,整型数据,2.4.1,整型变量,1.,分类 根据占用内存字节数的不同,整型变量又分为类:,(,1,)基本整型(类型关键字为,int,)。,(,2,)短整型(类型关键字为,short int,)。,(,3,)长整型(类型关键字为,long int,)。,(,4,)无符号整型。无符号型又分为无符号基本整型(,unsigned int,)、无符号短整型(,unsigned short,)和无符号长整型(,unsigned long,)三种,只能用来存储无符号整数。,2.,占用内存字节数与值域 上述各类型整型变量占用的内存字节数,随系统而异。在,16,位操作系统中,一般用字节表示一个,int,型变量,且,long,型(字节),int,型(字节),short,型(字节)。,显然,不同类型的整型变量,其值域不同。占用内存字节数为,n,的(有符号)整型变量,其值域为:,-2,n*8-1,(,2,n*8-1,-1,);无符号整型变量的值域为:,0,(,2,n*8,-1,)。例如,,PC,机中的一个,int,型变量,其值域为,-2,2*8-1,(,2,2*8-1,-1,),即,-3276832767,;一个,unsigned,型变量的值域为:,0,(,2,2*8,-1,),即,065535,。,2.4.2,整型常量,.,三种表示形式,整型常量即整常数,在语言中可用三种形式表示:,(,1,)十进制。例如,10,、,36,。,(,2,)八进制(以数字开头)。例如,012,。,(,3,)十六进制(以数字,+,小写字母,x,开头)。例如,0 x36,。,.,分类,(,1,)基本整型。在,16,位机中,用,2,字节存储,其数据范围与,int,型变量一样。,(,2,)长整型(在数值后面加“,L,(,l,)”)。对超出基本整型值域的整型常量,可使用长整型常量表示,其取值范围可达,-,-,(,-,)。例如,,123l,、,315,等。,.,类型匹配规则,类型匹配规则为:一个整型常量,可以赋给能容纳下其值的整型变量。,例如,其值在,-,-,(,-,)的整型常量,可以赋给,int,型变量和,long int,型变量;其值在,-,-,(,-,)的整型常量,就只能赋给,long int,型变量。,注意,:常量无,unsigned,型。但一个非负整型常量,只要它的值不超过相应变量的值域(即取值范围),也可以赋给,unsigned,型变量。,Return,2.5,实型数据,2.5.1,实型变量,语言的实型变量,分为两种:(,1,)单精度型。类型关键字为,float,,一般占字节(位)、提供位有效数字。(,2,)双精度型。类型关键字为,double,,一般占个字节、提供,1516,位有效数字。,2.5.2,实型常量,.,表示形式实型常量即实数,在语言中又称浮点数,其值有两种表达形式:(,1,)十进制形式。例如,3.14,、,9.8,。,(,2,)指数形式:,E,(,e,),。例如,3.0,+5,等。,.,关于类型,实型常量不分,float,型和,double,型。一个实型常量,可以赋给一个实型变量(,float,型或,double,型)。,Return,2.6,字符型数据,2.6.1,字符常量,1.,字符常量的定义,用一对单引号括起来的单个字符,称为字符常量。,例如,,A,、等。,2.,转义字符,语言还允许使用一种特殊形式的字符常量,就是以反斜杠“,”,开头的转义字符。,注意,:如果反斜杠或单引号本身作为字符常量,必须使用转义字符:,、,。,案例,2.1,用转义字符输出可打印字符和不可打印字符。,/*,案例代码文件名:,AL2_1.C*/*,程序功能:用转义字符输出可打印字符和不可打印字符*,/,main()printf(“x4Fx4Bx21n”);/*,等价于,printf(“OK!n”);*/printf(“x15 xABn”);,程序运行结果如下:!,程序演示,2.6.2,字符变量,字符变量的类型关键字为,char,,一般占用,1,字节内存单元。,1.,变量值的存储 字符变量用来存储字符常量。将一个字符常量存储到一个字符变量中,实际上是将该字符的,ASCII,码值(无符号整数)存储到内存单元中。,例如,,char ch1,ch2;/*,定义两个字符变量:,ch1,,,ch2*/,ch1=a;ch2=b;/*,给字符变量赋值*,/,2.,特性,字符数据在内存中存储的是字符的,ASCII,码 一个无符号整数,其形式与整数的存储形式一样(如图,2-4,所示),所以语言允许字符型数据与整型数据之间通用。,(,1,)一个字符型数据,既可以字符形式输出,也可以整数形式输出。,案例,2.2,字符变量的字符形式输出和整数形式输出,。,/*,案例代码文件名:,AL2_2.C*/*,程序功能:用字符形式和整数形式输出字符变量*,/main()char ch1,ch2;ch1=a;ch2=b;,printf(“ch1=%c,ch2=%cn”,ch1,ch2);printf(“ch1=%d,ch2=%dn”,ch1,ch2);,程序运行结果:,ch1=a,ch2=b ch1=97,ch2=98,程序演示,(,2,)允许对字符数据进行算术运算,此时就是对它们的,ASCII,码值进行算术运算。,案例,2.3,字符数据的算术运算。,/*,案例代码文件名:,AL2_3.C*/*,程序功能:字符数据的算术运算*,/main()char ch1,ch2;ch1=a;ch2=B;/*,字母的大小写转换*,/printf(“ch1=%c,ch2=%cn”,ch1-32,ch2+32);/*,用字符形式输出一个大于,256,的数值*,/printf(ch1+200=%dn,ch1+200);printf(ch1+200=%cn,ch1+200);printf(ch1+256=%dn,ch1+256);printf(ch1+256=%cn,ch1+256);,程序运行结果:,ch1=A,ch2=b,ch1+200=297,ch1+200=),ch1+256=353,ch1+256=a,程序演示,思考题,:用字符形式输出一个大于,256,的数值,会得到什么结果?,2.6.3,字符串常量,1.,字符串常量的概念和字符串长度,字符串常量是用一对双引号括起来的若干字符序列。,字符串中字符的个数称为字符串长度。长度为,0,的字符串(即一个字符都没有的字符串)称为空串,表示为“”(一对紧连的双引号)。,例如,“,How do you do.”,、“,Good morning.”,等,都是字符串常量,其长度分别为,14,和,13,(空格也是一个字符)。如果反斜杠和双引号作为字符串中的有效字符,则必须使用转义字符。,例如:(,1,),C:msdosv6.22 C:msdosv6.22,(,2,),I say:Goodbye!I say:Goodbye!“,2.,字符串的存储,C,语言规定:在存储字符串常量时,由系统在字符串的末尾自动加一个,0,作为字符串的结束标志。,注意,:在源程序中书写字符串常量时,不必加结束字符,0,,否则画蛇添足。如果有一个字符串为“,CHINA”,,则它在内存中的实际存储如下所示:,最后一个字符,0,是系统自动加上的,它占用字节而非字节内存空间。,C,H,I,N,A,0,综上所述,字符常量,A,与字符串常量,A,是两回事:,(,1,)定界符不同:字符常量使用单引号,而字符串常量使用双引号;,(,2,)长度不同:字符常量的长度固定为,1,,而字符串常量的长度,可以是,0,,也可以是某个整数;,(,3,)存储要求不同:字符常量存储的是字符的,ASCII,码值,而字符串常量,除了要存储有效的字符外,还要存储一个结束标志,0,。,Return,2.7,算术运算与算术表达式,在语言中,除控制语句和输入输出函数外,其它所有基本操作都作为运算符处理。,1.,五种基本算术运算符,+,、,-,(减法,/,取负)、*、,/,、,%,(求余数),(,1,)关于除法运算,/,C,语言规定:两个整数相除,其商为整数,小数部分被舍弃。例如,,5/2