《基本数据类型与表达式.ppt》由会员分享,可在线阅读,更多相关《基本数据类型与表达式.ppt(51页珍藏版)》请在三一办公上搜索。
1、第二章,基本数据类型与表达式,第二章 基本数据类型与表达式,本章内容主要有:C+数据类型 符号常量与常值变量 数值、逻辑表达式 自定义类型修饰符 表达式的副作用与表达式语句,学习的目标 了解C+基本数据类型 了解符号常量与常值变量 了解自定义类型修饰符 掌握数值、逻辑表达式 掌握表达式的副作用与表达式语句,第二章 基本数据类型与表达式,2.1 C+数据类型概述,数据类型是指定义了一组数据以及定义在这一组数据的操作,它是程序中最基本的元素。在程序设计中类型具有重要的意义。C+预定义了丰富的数据类型,也允许用户自定义数据类型。C+数据类型分为:基本数据类型和构造数据类型。,2.1 C+数据类型概述
2、,基本数据类型:1、整型类包括整型(int)、短整型(short)、长整型(long)还有与整数兼容的数据类型,包括字符型(char)、枚举型(enum)和逻辑型(布尔型bool)。2、实型类(浮点型)包括单精度(float)、双精度(double)和长双精度(long double)。,2.1 C+数据类型概述,构造数据类型:1、指针类包括指针和应用2、数组。3、记录类包括结构struct和联合(union)。,2.1 C+数据类型概述,为什么要区分数据类型?1、规定了不同数据类型在内存中的存储格式不同。C+语言中的整型数和实型数与数学中的整数和实数有区别。2、对不同的类型数据所能实施的操作
3、不同。如两个整型数据可以相加,而两个记录数据不能相加。,2.1 C+数据类型概述,数据最常用的表现形式:1、常量在程序运行中不变,其数据类型可分为整型(123)、实型(12.4)、字符型(s)和字符串型(Hello,你们好!)。2、变量在程序运行中可变,变量名必须实合法的标识符(区分大小些),即只能是数字、字母和下划线,而且第一个字符不能是数字。,2.2.1.各种整型数据的基本情况(课本表2-1)整型前面可以加上signed(有符号型)或unsigned(无符号型)、long(长整型)或short(短整型)来修饰。其中signed和unsigned不能同时出现,long和short也不能同时出
4、现。在三种不同的规格中短整型(short、unsigned short)中用空间最少,表示的范围也最少;长整型(long,unsigned long)表示的范围最大,占用的空间也最大。,2.2 整型数据,2.2 整型数据,2.2.2.短整型常量表示方法短整型常量是借助整型常量来表示的,短整型无条件的转换为整型。2.整型常量表示方法:1)十进制。2)八进制整型常量必须以0打头,其后有07之间的数字组成。如0123)十六进制整型常量以0 x或0X打头,其后09之间的数和英文字母af(或AF组成)。如0X32,0 xA8等。,3、整型常量加后缀,以区分各种不同类型的整数1)后缀L(或l)。表示长整型
5、常量(long int型)如-56L,4562l;2)后缀U(或u)。表示无符号整型常量(unsigned int型)如85U,20u;3)后缀L(或l)和U(或l)组合,表示无符号长整型常量(unsigned long int型)如464LU,586Lu,4645lU,123lu。,2.2 整型数据,2.2.3 整型变量的定义和初始化。变量是用来存放数据的,因此应具有相应的类型,C+中每个变量都属于一个特定的类型,变量类型决定了它在内存中的存储形式及取值范围。引用一个变量名之前必须先声明变量的类型,限定用法和操作,保证不会进行非法的操作。,2.2 整型数据,2.2 整型数据,C+中,变量必须
6、先定义,后使用。不一定先定义,随定随用。变量定义使用一个声明语句。格式:类型 变量名;或 类型 变量名1,变量2,-变量n;,变量名的命名要遵守以下规则:不能是C+关键字。C+的关键字如下表所所示。第一个字符必须是字母或下划线,中间不能有空格。变量名除了使用26个英文大小写字母和数字外,只能使用下划线。一般不要超过31个字符。变量名不要与C+中的库函数名、类名和对象名相同。例如,下列变量名是合法的变量名:a123 c3b file_1,例如:语句 int x,y;/定义了一个整型变量 char ch;/定义了一个字符型变量,2.2 整型数据,表2-1 C+的标准关键字,变量声明后类型就确定了。
7、编译器就为该变量在内存中开辟了存储单元。变量可以在定义时初始化,也即个变量赋一个初值。例如:int a=3,b=-7;/也可以先定义,后赋值 int a,b;a=3,b=-7;double area=67.31;则变量a、b、area分别被赋予初值,3、-7、67.31,并一直保留改值直到被修改为止。,2.2 整型数据,注意:1、若一个变量没有被初始化,则系统会为该变量规定一个默认值或无效值,直到被修改。2、初始化数据的类型与所规定的类型不一致,自动进行隐含转换,数据将转换成变量类型。如 int a=3.14(允许)。但会丢失小数部分。3、在同一个块中或复合语句中,不允许定义同名变量,而在不同
8、的块中可以。如:int k;-/块1 int k;-/块2 是合法的。,2.2 整型数据,2.3 字符型数据,2.3.1 字符型数据的基本情况(课本表2-2)类型修饰符char有可能表示有符号字符,也可能表示无符号字符。2.3.2 字符型常量的表示字符又分为可显示的和不能显示的。可显示的用符号图形来表示,即用引号括起来的单个字符,如k,等。,不能显示的(产生某些控制)用转义序列来表示(两种形式):1.用反斜杠加上该字符的ASCII码来构成。ASCII码可采用八进制、十六进制。2.另一种称为转义字符,由一个反斜杠后跟一个字符来表示。如下表所示:3.转义字符只代表一个字符,可显示字符也可以用转义字
9、符来表示。,2.3 字符型数据,2.3.3 字符型变量的定义和初始化 与整型类似,如char c1,c2=A;上面定义了两个字符型变量,其中c2被初始化为字符A。2.3.4 字符型与整型的关系字符用代码表示,代码就是一个整数。在表达式求值中,字符被转换成与其代码等值的整数,因此能对字符实施算术运算。如,char ch1=A,ch2=a;也可以写成 char ch1=65,ch2=97;,2.3 字符型数据,2.4.1 枚举型数据的基本情况(课本表2-3)不是系统预定义的,而是用enum关键字(保留字,是系统预定义有的特殊含义的单词)自定义的数据类型。它的值域由用户定义的一组符号常量限定的。目的
10、是提高程序的可读性。,2.4 枚举型数据,2.4.2 枚举类型的定义和枚举变量的定义格式:enum 枚举类型名 枚举常量名1;枚举常量名2;-;枚举变量;/在定义枚举类型的同时定义枚举变量。例如:enum WeekDaySunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday today;,2.4 枚举型数据,也可以在枚举类型定义后,再定义枚举变量格式.如:WeekDay today=Monday,tomorrow=Tuesday;并赋初值。枚举变量只能在枚举常量集合中取值。不能进行算术运算,只能赋值,比较和输出。,2.4 枚举型数据,2
11、.4.3 枚举型与整型的关系 C+编译程序为每个枚举常量分配一个整数型数值,默认时第一个枚举元素的值为0,依次类推,第n个为n-1。也可以显示的指定枚举常量的值,后面逐个增1取值。如重新定义WeekDay如下;enum Week Sunday=1,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday=0;Week 和WeekDay枚举常量有相同的取值。C+语言不允许枚举类型有相同的枚举常量。C+不识别枚举符号。,2.4 枚举型数据,2.5.1 各种实型数据的基本情况(课本表2-4)实数又称浮点数,与数学中的浮点数的区别:1、数学中的实数值域从无穷小
12、到无穷大,计算机中实数的值域有限。2、数学中的实数精度是任意的,计算机中精度有限,C+提供了单精度、双精度、长双精度3种实型类型。,2.5 实型数据,实型常量的表示浮点数只能以十进制表示,可以采用科学记数法和一般表示方法。科学记数法常用于表示很大或很小的浮点数。如1.2E8(即1.2108)、-5.731E-9(即-5.73110-9)。浮点数的整数部分和小数部分如果为零可以省去,但不能两者都省去。例如.34 456.5.E3.89E2(都合法)。,2.5 实型数据,浮点数还可以带后缀,以区分不同的类型的实数。1、没有后缀,表示双精度(double型)。如73.23。2、后缀为F(或f),表示
13、单精度的(float)。如4.266F。或-1.2f。3、后缀为L(或l),表示长双精度(long double)。如8.5l、2.07L。2.5.3 实型变量的定义和初始化与整型类似,2.5 实型数据,符号常量的定义:如define PI 3.1416 表在程序中用PI表示3.1416。好处:1、提高程序的可读性。有意义的名词作为符号常量。2、提高数据的一致性 3、提高数据的可维护性。达不到预期的精度,只需重新 定义。常值变量的定义格式:const 数据类型 常量标识符 表达式 如,const double PI=3.1416;常值变量定义时必须初始化,在程序中不允许改变。上 述两者等价。,
14、2.6 符号常量和常值变量,2.7.1 无操作符的表达式简单表达式常量、变量和函数调用是三种最简单的表达式。简单表达式依据数据类型可分整型、长整型、双精度表达式等。数值表达式是整型类表达式和实型类表达式的统称。,2.7 数值表达式,2.7 数值表达式,2.7.2 算术运算C+算术运算符包括一元运算符(取负值)、+(取正值)和二元运算符+(加)、(减)、*(乘)、/(除)、(取余数)。其中只用于int整型,如1031(int)。其余可以用于既可以用于int又可以用于float 和double类型数据。用算术符号联起来的表达式称算术表达式。除法运算用于整型和实型是不同的。用于整数,/表示整除。如5
15、/2=2(int)、10/3=3(int)。而用于浮点数,5.0/2.02.5(float)、8.0/5.0=1.6(float)。,2.7 数值表达式,2.7.3 位操作符(看书本)2.7.4 赋值操作符(1)赋值运算符“=”的一般格式为:变量=表达式;表示将其右侧的表达式求出结果,赋给其左 侧的变量。例如:int i;i=3*(4+5);/i的值变为27(2)赋值表达式本身的运算结果是右侧表达式的 值,而结果类型是左侧变量的数据类型。例 如:int i=1.2*3;/结果为3,而不是3.6,(3)赋值运算符的结合性是从右至左的,因 此,C+程序中可以出现连续赋值的情 况。例如,下面的赋值是
16、合法的:int i,j,k;i=j=k=10;/i,j,k都赋值为10,2.7 数值表达式,2.7.5 复合赋值操作符复合操作符如书本P.28所示(从左到右结合)。它们的含义如下:,a+=b 等价于 a=a+ba-=b 等价于 a=a-ba*=b 等价于 a=a*ba/=b 等价于 a=a/ba%=b 等价于 a=a%ba=b 等价于 a=ab a&=b 等价于 a=a&ba=b 等价于 a=aba|=b 等价于 a=a|b,例如:int a=12;a+=a;表示a=(a+a)=(12+12)=24;又例如:int a=12;a+=a-=a*=a;表示a=a*a/a=12*12=144a=a-
17、a/a=144-144=0a=a+a/a=0+0=0,2.7 数值表达式,自增、自减运算符(1)自增(+)、自减(-)运算符为变量的增1和减1提供了紧凑格式。(2)自增、自减运算符都是单目运算符,其作用是使变量的值增1或减1。(不可过分的使用,使程序难以理解并降低其可移植性)。(3)自增、自减运算符有四种应用格式:,int a=3;b=a+;等价于 b=a;a=a+1;int a=3;b=a-;等价于 b=a;a=a-1;(运算符后置用法,代表先使用变量,然后对变量增值)int a=3;b=+a;等价于 a=a+1;b=a;int a=3;b=-a;等价于 a=a-1;b=a;(运算符前置用法
18、,代表先对变量增值,再使用变量),2.7 数值表达式,(4)C+编译器在处理时尽可能多的自左向右将运算符结合在一起。例如:a+b表示为(a+)+b而不是a+(+b)。(5)在调用函数时,实参的求值顺序一般为自右向左。而不是PASCAL语言那样自左向右。例如:int a=1;printf(“%d,%d,%d”,a+,a+,a+);输出的结果为3,2,1而不是1,2,3。,2.7 数值表达式,例2.1:引用前增量和后增量运算。#include int main()/显示m+和+m的区别int m,n;m=44;n=+m;/前操作符m=m+1,n=mcoutm=m,n=nendl;m=44;n=m+
19、;/后操作符n=m,m=m+1coutm=m,n=nendl;,上面程序执行结果在屏幕上显示:m=45,n=45m=45,n=44语句:n=+m;先将m增加为45,在赋给n。语句:n=m+;先将m值赋给n后,才将m增加为45。所以下一条语句打印时,n为44。,2.7 数值表达式,2.7.7 sizeof 操作符用于获得一数据或数据类型所占空间的字节数,使用格式:sizeof(类型修饰符)或sizeof(表达式),2.7 数值表达式,例2.2:使用sizeof运算符#include void main()coutNumber of byte used:n;coutt char:sizeof(ch
20、ar)endl;coutt short:sizeof(short)endl;coutt int:sizeof(int)endl;coutt long:sizeof(long)endl;coutt unsigned char:sizeof(unsigned char)endl;coutt unsigned short:sizeof(unsigned short)endl;coutt unsigned int:sizeof(unsigned int)endl;coutt unsigned long:sizeof(unsigned long)endl;coutt unsigned char:size
21、of(unsigned char)endl;coutt float:sizeof(float)endl;coutt double:sizeof(double)endl;coutt long double:sizeof(long double)endl;,Number of byte used:char:1 short:2 int:4 long:4 unsigned char:1 unsigned short:2 unsigned int:4 unsigned long:4 unsigned char:1 float:4 double:8 long double:8可以看出int和long相同,
22、unsigned int和unsigned long相同,double和longdouble相等。,2.7 数值表达式,2.7.8 操作符的优先级和结合性在C+程序中,当一个表达式中有多个运算符时,它的优先级和结合性就决定了各运算的顺序。优先级越高的先做运算,低的后作运算,相同时由结合性决定运算次序。运算符的结合性分左到右计算和右到左计算。如+和左结合,表达式45+94-23;而赋值右到左,x=y=56。有关操作符的优先级和结合性参考书本附录A。从表可以看出C+的优先级有如下规律:一元二元(除赋值)三原赋值逗号;而二元运算符又有如下规律:算 术关系逻辑;逻辑又有如下规律:!&|。,2.7 数值
23、表达式,例2.3 其分析表达式的求值顺序假定:int x=5,y=4,z=6,w=2;char a=s,b=t;表达式1、z/y2、z/4.03、z/y%z/x4、ab|yz5、a!=b&z-66、a=b&!(yz)7、a=b&!yz8、x+1+z9、x+1z+10、-x-y|x+yz&z%3=0书写表达式时,应注意的表达式与数学中的表达式的区别书本P.31。,2.7 数值表达式,2.7.9 类型的自动转换(隐式转换)与强制转换1.隐式转换是由系统自动进行的类转换。C+对 表达时求值时,表达式中有不同类型的操作数时,要进行类型转化,再求表达式的值。通常发生在二元运算时,它要求两个操作数一致。隐
24、式转换的原则:,(1)赋值运算符“”左右两边不同类型时,总是右边 表达式类型转换成左边变量的类型,再赋值给左 边的变量。如:int a=6;double b=3.5;a=b;cout”a=”a”b=”b”n”;输出a=3,b=3.5(上机实验)(2)short型、signed short型和所有的chart型在运 算前无条件的转换为int型。,(3)除了上述情外,一个二元运算符的两边数就不 同,则将较小类型值向较大的类型值转换。运算 结果同高类型一致。可保证数据的进度不受损。类的高低次序依次:int,unsigned,long,unsigned long,float,double,long d
25、ouble。(4)在函数调用时,实参类型先转换成形参类型。改 函数有返回值时,该值的类型与该函数类型一 致。,例2.4 分析下面程序的运行结果#include void main()int x;char ch=a;x=ch+200;coutx=xn;coutch=chn;coutch+200ch+200n;,上面程序执行结果在屏幕上显示:x=297ch=ach+200=297强制转换:指定某种类型的数据强制性转换为另一种类型。而不必准循隐式转换的规则。有两种形式:类型名(表达式)或(类型名)表达式,2.8 逻辑型数据与逻辑表达式,2.8.1 逻辑型数据的基本情况使用bool为类型修饰符,值域只
26、有两个值false(或0)表示逻辑假和true(或非零)表示逻辑真。逻辑变量的定义和初始化与整型、实型的方法相识。,2.8 逻辑型数据与逻辑表达式,2.8.2 逻辑表达式1.无操作符的逻辑表达式逻辑常量、逻辑变量和逻辑型函数的调用2.关系操作符和关系表达式C+的关系运算符都是二元的,有、=、=、!=。由关系运算符联起来的表达式就称为关系表达式。它只有两个值:1和0。1表示真,即关系表达式成立。0表示假,即关系表达式不成立。如,6=4的值为1,而67!=67的值为0。,2.8 逻辑型数据与逻辑表达式,3.逻辑操作符和逻辑表达式C+的逻辑运算符包括3个:!(一元运算符,逻辑非)和二元运算符&(逻辑
27、与)、|(逻辑或),逻辑非的优先级最高,逻辑与次之,逻辑或最低。用逻辑运算符连起来的表达式称为逻辑表达式。其结果只能取1或0。逻辑运算真值表如下表所示:,注意:C+在计算逻辑表达式的值时,若从左到右计算到某处就已经能够确定表达式的值,则就不用继续后面部分的求值。如表达式:e1&e2,e1为0,就可以确定表达式的值,就不用求表达式e2的值了。同样,e1|e2,e1为真,就知表达式的值,不用求e2。,2.8 逻辑型数据与逻辑表达式,2.8.3 复合条件 逻辑与&和逻辑或|都用于构造复合表达式,其左右两边的操作对象称为子对象。子对象1&子对象2表示两个子条件同时成立时这个复合条件成立。子对象1|子对
28、象2表示两个子条件有一个成立时这个复合条件成立。,2.8 逻辑型数据与逻辑表达式,2.8.4 相反条件6个操作符可以分为3对:和=、=和!=利用这种配对关系,可以构造出一个条件相反的条件。如xy和xy的相反条件!(x=y)。,2.8 逻辑型数据与逻辑表达式,2.8.5 等价条件若两个表达式在任何情况下同为true或同为false,则称这两个表达式为等价表达式。分三组情况:相反条件的相反条件等价于原条件。!对于&和|起到分配率的作用。注意&和|的相互调换。交换律适用于逻辑与和逻辑或这两种操作。,2.8 逻辑型数据与逻辑表达式,2.8.6 永假条件和永真条件 条件表达式永为真称为永真条件,条件表达
29、式永为假称为永假条件。如书本例子所示。2.8.7 逻辑型与其他数据类型的关系 反映在以下几点:(如书所示)总之一句话,0就是假,1就是真。注意:数值型数据与逻辑型数据同时出现在同一 表达式中,逻辑型数据将无条件的转化为数值型数据0和1。任何非零数值对逻辑型变量赋值都转化成1。如书上例子所示。,2.8 逻辑型数据与逻辑表达式,2.8.8 条件运算符 条件运算符?:是C+中为唯一的一个三元运算符。其表达形式:e1?e2:e3。其中e1、e2和e3都为表达式。条件操作符执行的操作:先计算e1的值,若非0,则计算e2的值作为整个表达式的值;e1的值为非0,计算e3的值作为整个表达式的值。如:wqp=(
30、xy)?10:20。,2.9 自定义类型修饰符,自定义类型修饰符 就是用一个自定义的标识符来代表一个特定的数据类型。自定义格式:typedef 修饰符类型 新的标识符 如:typedef int shijian 好处:1.提高程序的可靠性。2.提高程序的可维护性。3.避免类型使用上的不一致。,2.10 表达式的副作用与表达式语句,表达式分为无副作用和有副作用的表达式两类。在C+表达式中,需要提取参与表达式计算的变量的值,但通常不会改变它们的值,这就是无副作用。如k+m。,2.10 表达式的副作用与表达式语句,表达式的副作用在C+表达式中,在其求值过程中不但要提取变量的值,还可能改变它们的值,这
31、就是副作用。相应副作用的操作符有(如书所示)。它只能用于变量。它们的特点:除了后增1和后减1以外,作为操作结果的表达式的值就是所作用的变量所获得的值。操作结果表达式的值存放在变量中。注意:作用于变量的操作只能施加于变量对象。当若干个作用于变量的操作施加于同一个变量时,除了最后一个外,不得有后增1和后减1。,2.10 表达式的副作用与表达式语句,2.10.2 表达式副作用的应用逗号操作符与逗号表达式。逗号操作符为,格式:表达式1,表达式2。由逗号操作副构成的表达式称为逗号表达式。上式表达式的值为表达式2,其类型与表达式2相似。2.10.3 表达式副作用的应用表达式语句 C+中任何一个表达式都可以作为一个语句来使用,称为表达式语句。表达式作为语句使用时,它的值被舍弃不用,其语句通过它的副作用体现出来,因而把没有副作用的表达式作为语句使用毫无意义。,