第2章基本数据类型与表达式.ppt

上传人:本田雅阁 文档编号:3423783 上传时间:2019-08-24 格式:PPT 页数:58 大小:151.54KB
返回 下载 相关 举报
第2章基本数据类型与表达式.ppt_第1页
第1页 / 共58页
第2章基本数据类型与表达式.ppt_第2页
第2页 / 共58页
第2章基本数据类型与表达式.ppt_第3页
第3页 / 共58页
第2章基本数据类型与表达式.ppt_第4页
第4页 / 共58页
第2章基本数据类型与表达式.ppt_第5页
第5页 / 共58页
点击查看更多>>
资源描述

《第2章基本数据类型与表达式.ppt》由会员分享,可在线阅读,更多相关《第2章基本数据类型与表达式.ppt(58页珍藏版)》请在三一文库上搜索。

1、第二章 基本数据类型与表达式,主要内容,数据类型的概念 C+基本数据类型 常量与变量 操作符 表达式,数据类型的概念,一种数据类型可以看成由两个集合构成: 值集:描述了该数据类型包含哪些值(包括这些值的结构); 操作(运算)集:描述了对值集中的值能实施哪些运算。 例如: 整数类型就是一种数据类型,它的值集就是由整数所构成的集合,它的操作集包括:加、减、乘、除等运算。 数据类型可以分为: 简单数据类型:值集的数据是不可再分解的简单数据,如:整数类型、实数类型等; 复合数据类型:值集的数据是由其它类型的数据按照一定的方式组合而成,如:向量、矩阵等。,区分数据类型的好处 对数据进行分类,便于数据的处

2、理。 提高程序的可靠性,便于自动进行类型一致性检查。 便于产生高效代码 语言对类型的支持 静态类型与动态类型语言 静态类型:在静态程序中区分类型 动态类型:在程序运行中区分类型 强类型与弱类型语言 强类型:自动类型检查 弱类型:不作或很少作类型检查 C+是静态的强类型语言,C+数据类型,C+根据数据类型的提供方式(系统提供和用户定义),把数据类型分为: 基本数据类型 是C+语言预先定义好的数据类型,常常又称为标准数据类型或内置数据类型(built-in types),它们都是简单类型。 构造数据类型 是指由用户利用语言提供的类型构造机制从其它类型构造出来的数据类型,它们大多为复合数据类型(枚举

3、类型除外)。 抽象数据类型 是指由用户利用数据抽象机制把数据与相应的操作作为一个整体来描述的数据类型。它们一般为复合数据类型。,C+基本数据类型,C+基本数据类型指的是语言预定义的数据类型,称为标准或内置数据类型, C+基本数据类型对应着能由计算机直接表示和处理(机器指令能对它们直接进行操作)的数据类型,包括: 整数类型 实数类型 字符类型 逻辑类型 空值类型,整数类型,整数类型用于描述通常的整数。包括: int short int或short long int或long “short int”的范围 “int”的范围 “long int”的范围 unsigned int或unsigned u

4、nsigned short int或unsigned short unsigned long int或unsigned long unsigned(无符号)整数类型只能表示正整数,它们所占的内存大小与相应的有符号整数类型相同,但所表示的最大正整数比相应的有符号整数类型所表示的最大正整数要大(大约一倍)。,整数类型数据在计算机内部通常用补码表示: 正整数的补码为它的二进制原码表示; 负整数的补码为把相应正整数的二进制表示中各个二进制位取反后得到的整数加1。 例如: 如果用一个字节存储整数类型数据,则12和-12的补码分别为:00001100和11110100。,整数类型的内部表示,实数类型,实数

5、类型又称浮点型,它用于描述通常的实数。包括: float (单精度型) double (双精度型) long double(长双精度型) “float”的范围 “double”的范围 “long double”的范围,实数类型的内部表示,在计算机内部,实数表示成: a2b, a:尾数;b:指数 在实数的内存空间中存储的是尾数和指数两部分,它们均采用二进制表示。 有些十进制小数是不能精确表示成二进制小数的。 例如,十进制小数0.1就无法精确地用二进制表示。,字符类型,字符类型是用于描述文字类型的数据。包括: char signed char unsigned char wchar_t 字符在计算

6、机中存储的是它的编码。 char、signed char和unsigned char表示单子节编码的字符。 wchar_t表示多字节编码的字符。 C+允许把字符类型的数据当作整数类型数值进行算术运算。 对signed char,把字符编码看成有符号整数。 对unsigned char,把字符编码看成无符号整数。,常用的字符集及其编码,ASCII字符集 10个数字 26个英文字母(包括大、小写) 其它一些常用符号(如标点符号、数学运算符等) 09十个数字、26个大写英文字母以及26个小写英文字母的编码各自是连续的 一个字节编码,最多表示256个字符 用char、signed char或unsig

7、ned char类型描述,常用的字符集及其编码(续),Unicode(国际通用字符集) 大部分语言中的字符 24个字节 用wchar_t描述 GB2312(简体中文) 2个字节 用2个unsigned char描述 Big5(繁体中文) 2个字节 用2个unsigned char描述 Shift-JIS(日文) 2个字节 用2个unsigned char描述,逻辑类型,逻辑类型用于描述“真”和“假”这样的逻辑值,它们为条件表达式的计算结果,分别表示条件的满足和不满足。 在C+中,逻辑类型用bool表示,它的值只有两个:true和false,分别对应“真”和“假”。 逻辑值也可以参加算术运算:

8、true对应1、false对应0 其它类型的数据可以转换成逻辑型: 0 false 非0 true,空值类型,在C+中提供了一种值集为空的类型:空值型(void),用以表示: 没有返回值的函数的返回类型 通用指针类型(void *),在C+中,常常 把各种int型、char型以及bool型统称为整型(integral types); 把整型和实数类型统称为算术类型(arithmetic types)。,整型(integral types)和 算术类型(arithmetic types),sizeof,在不同规格的计算机上,各种数据类型的数据的取值范围可能不一样。在C+中, 可以通过“sizeo

9、f(类型名)”或“sizeof(变量名)”来计算各种数据类型的数据所占的内存空间大小(字节数) 。 标准库的头文件climits(或limits.h)定义了所有整型的取值范围, 标准库的头文件cfloat(或float.h)定义了所有实数类型的取值范围。,typedef,C+允许在程序中给已有数据类型取一些别名,格式为: typedef ; 例如: typedef unsigned int Uint; unsigned int x; Uint x; typedef并没有定义新类型。 便于程序的阅读和编写,并使程序简明、清晰和易于修改。,数据的表示,在程序中,数据以两种形式存在:常量和变量。 常

10、量:在程序执行过程中不变(或不能被改变)的数据,如:圆周率、一个星期的天数等。 变量:在程序执行过程中值可变的数据,如:2*PI*r中的r。,常量,C+把常量分为:整数类型、实数类型、字符类型、逻辑类型、字符串类型以及指针类型。 在C+程序中,常量可以用两种形式表示: 字面常量:在程序中通过直接写出常量值来使用的常量,通常又称为直接量(literal)。 符号常量(命名常量):通过常量定义给常量取一个名字并指定一个类型,在程序中通过常量名来使用这些常量。,字面常量(直接量),C+的字面常量有: 整数类型常量 实数类型常量 字符类型常量 字符串常量,整数类型字面常量,在C+程序中,整数类型常量可

11、以用十进制、八进制或十六进制形式来书写: 十进制形式。由09数字组成,第一个数字不能是0(整数0除外),如:59,128,-72为整数类型常量的十进制表示; 八进制形式。由数字0打头,07数字组成,如:073,0200,-0110为八进制表示; 十六进制形式。由0x或0X打头,09数字和AF(或af)字母组成,如:0x3B, 0x80, -0x48,为十六进制表示 可在整数类型常量的后面加上l或L,表示long int类型的常量,也可在整数类型常量的后面加上u或U,表示unsidned int类型的常量,,实数类型字面常量,在C+程序中,实数类型常量采用十进制形式书写(在计算机内部采用二进制存

12、储)。 实数类型常量有两种表示法:小数表示法和科学表示法。 小数表示法:由整数部分、小数点“.”和小数部分构成,如:456.78, -0.0057,5.,.5。 科学表示法:在小数表示法后加上一个指数部分,指数部分由E(或e)和一个整数类型数构成,表示基数为10的指数,如:4.5678E2, -5.7e-3等。 实数类型常量为double型。可以在实数类型常量后面加上F(f)以表示float型,如:5.6F。也可在实数类型常量后面加上L(l)表示long double型,如5.6L。,字符类型字面常量,字符常量是由两个单引号()括起来的一个字符构成,其中的字符写法可以是: 字符本身,如:A 转

13、义序列,由打头的一串符号 字符的编码 八进制:ddd,如:101 十六进制:xhh,如:x41 特殊表示,如:n(换行符)、r(回车符)、t(横向制表符)、b(退格符)等 注意: 反斜杠()应写成: 单引号()应写成: 双引号(“)可写成:“或 “,字符串类型字面常量,字符串常量是由两个双引号(“)括起来的字符序列构成,其中的字符的写法与字符类型常量基本相同,即可以是字符本身和转义序列。如: “This is a string.“ “Im a student.“ “Please enter “Y“ or “N“:“ “This is two-line nmessage!“,字符常量与字符串常量

14、的区别,字符常量表示单个字符,其类型为字符类型(char);而字符串常量可以表示多个字符,其类型为常量字符数组(参见5.2.1 节中的6)。 字符常量用单引号表示;而字符串常量用双引号表示。 对字符常量的操作按char类型进行;对字符串常量的操作按字符数组的规定。 字符常量在内存中占一个字节;字符串常量占多个字节,其字节数为:字符串中的字符个数加上1。,A,“A“,A,A,0,符号常量,在程序中使用常量时,除了采用字面常量形式外,还可以首先通过常量定义给常量取一个名字并指定一个类型;然后,在程序中通过常量名来使用这些常量。 符号常量的定义格式为: const =; 或 #define 例如:

15、const double PI=3.1415926; 或, #define PI 3.1415926,使用符号常量的好处,增加程序的易读性 提高程序对常量使用的一致性 增强程序的易维护性,变量,在程序中,其值可以改变的量称为变量。变量可以用来表示可变的数据。 例如:在计算圆周长的表达式2*PI*r中,半径r就是一个可变的数据,它可能是通过用户输入得到,也可能由程序的其它部分计算得到。,变量的基本特性,变量名:用标识符表示 类型:指定变量能取何种值、对其能进行何种运算(操作)以及所需内存空间的大小等。 值:在类型的值集范围内可变。 内存地址,变量的定义,C+语言规定:程序中使用到的每个变量都要有

16、定义(有的语言不需要)。格式为: ; 或者 =; 例如: int a=0; int b=a+1; double x=0.5; 或: int a=0,b=a+1; double x=0.5;,变量的声明,在C+程序中使用(访问)一个变量之前,必须对它进行声明。 变量定义属于一种声明,称为定义性声明。 变量声明的另一种形式为: extern ; 称为非定义性声明。 在使用一个全局变量前,如果未见到它的定义,则需要采用非定义性声明。 为了描述方便, 把定义性声明称为定义, 把非定义性声明称为声明。,/file2.cpp void g() /定义 extern int x,y; /声明 int z;

17、/定义 z = x + y; ,/file1.cpp int x=0; /定义 void f() /定义 extern int y; /声明 x = y + 1; int y=0; /定义 int main() /定义 extern void g(); /声明 y = x + 2; f(); g(); return 0; ,变量定义与声明的区别,变量定义要给变量分配空间,变量声明则否。 变量定义可以给变量赋初值(对变量进行初始化),变量声明则否。如: int a=1,b=2,c=3; /OK extern int d=4; /Error 在整个程序中,一个变量的定义只能有一个,而对该变量的声明

18、可以有多个。,变量值的输入,#include /插入一些在标准库中定义的输入/输出操作所需要的声明 using namespace std; /C+标准库中的程序实体是在名空间std中定义的。 int i; double d; cin i; /从键盘输入一个整数类型数给变量i cin d; /从键盘输入一个双精度浮点数给变量d 上述的键盘输入也可以写在一条语句中: cin i d; 在输入时,一般用空白符(空格符、横向制表符或回车符)作为输入数据之间的分隔符,每一个输入数据的格式应与相应变量的类型相符。例如 输入数据为:12凵3.4 则i的值为:12,d的值为:3.4。 输入的数据为: 012

19、凵3.4 则i的值为:10,d的值为:3.4。 输入的数据为:12a3.4 则i的值为:12,d的值没有意义。,操作符(运算符),操作符用于描述对数据的运算。这里的数据称为操作数,它们可以是: 常量 变量 函数调用 其它操作符的运算结果 通常情况下,操作符所指定的运算不会改变操作数的值(运算结果将保存在临时的存储单元中)。 在C+语言中,有些操作符(如:赋值=、自增+、自减-等操作符)的运算在得到一个运算结果的同时,也会改变操作数的值,称这些操作符带有副作用。 有副作用的操作有时会产生不良结果!,C+操作符的种类,算术操作符 关系与逻辑操作符 位操作符 赋值操作符 其它操作符,算术操作符,算术

20、操作符的操作数类型一般为算术类型,有时也可以是枚举类型和指针类型。包括: 取负“-”与取正“+” 加“+”、减“-”、乘“*”、除“/”和取余数“%” 操作符“/”用于整型操作数时表示整除,小数点后面的数将舍去,并且一般不进行四舍五入。例如: 3/2的结果为1;-10/3的结果为-3 取余数“%”操作符用于计算两个整型数相除的余数,操作数的类型应为整型和枚举类型。例如: 10%3的结果为1;8%2的结果为0 (a/b)*b+a%b = a,算术操作符(续),自减“-”和自增“+” int x=1,y; y = (+x) /x的值是2,y的值是2 (先加后用) y = (x+) /x的值是2,y

21、的值是1(先用后加) 注意:操作符“-”和“+”是两个带副作用的操作符,操作数的类型转换,在C+中,进行算术运算前通常要对操作数进行类型转换,特别是对两个类型不同的操作数,往往要把它们转换成相同类型。算术运算的结果类型与转换后的操作数类型相同。 C+的类型转换方式有两种:隐式转换和显式转换。 隐式转换是指由编译程序按照某种预定的规则进行自动转换,基本原则:精度低精度高; 显式转换是指由写程序的人在程序中用类型转换操作符明确地指出转换。,常规算术转换规则 (usual arithmetic conversions),如果其中一个操作数类型为long double,则另一个转换成long doub

22、le。 否则,如果其中一个操作数类型为double,则另一个转换成double。 否则,如果其中一个操作数类型为float,则另一个转换成float。 否则,先对操作数进行整型提升转换(integral promotions),如果转换后操作数的类型不一样,则按e)以后的规则再进行转换。,如果其中一个操作数类型为unsigned long int,则另一个转换成unsigned long int。 否则,如果一个操作数类型为long int,另一个操作数类型为unsigned int,那么,如果long int能表示unsigned int的所有值,则unsigned int转换成long i

23、nt,否则,两个操作数都转化成unsigned long int。 否则,如果一个操作数类型为long int,则另一个操作数转换成long int。 否则,如果一个操作数类型为unsigned int,则另一个操作数转换成unsigned int。,整型提升转换 (integral promotions),对于char、signed char、unsigned char、short int、unsigned short int类型,如果int型能够表示它们的值,则这些类型转换成int,否则,这些类型转换成unsigned int。 bool型转换成int型,false为0;true为1。 w

24、char_t和枚举类型转换成下列类型中第一个能表示其所有值的类型:int、unsigned int、long int、unsigned long int。,隐式转换的问题,隐式转换有时不能满足要求。 例如: int i=-10; unsigned int j=3; i+j将得到错误的结果:4294967289 再例如: int i=2147483647; /int类型中最大的正整数 int j=10; i+j将得到错误的结果:-2147483639,显式转换(强制类型转换),显式转换是指在程序中用类型转换操作符显式地指出转换,显式转换又称强制类型转换。其格式为: () 或 () 例如: int

25、 i=-10; unsigned int j=3; i+(int)j将得到正确的结果:-7 再例如: int i=2147483647; /int类型中最大的正整数 int j=10; (double)i+j将得到正确的结果:2147483657.0,关系与逻辑操作符,程序中经常要根据某个条件来决定其后续的动作,这里的条件为对数据进行比较和逻辑运算。 关系操作符 对数据进行大小比较,结果为bool类型的值:true或false。 (大于), =(不小于), 2的结果为true 4.3 1e-6,关系与逻辑操作符(续),逻辑操作符 逻辑操作符实现逻辑运算,用于复杂条件的表示中。 !(逻辑非)、&

26、(逻辑与)、|(逻辑或),!true - false !false - true,false | false - false false | true - true true | false - true true | true - true,false & false - false false & true - false true & false - false true & true - true,例如: !(a b) (age 30) (ch 9),短路求值 (short-circuit evaluation),在C+中,对于逻辑“与”操作符“&”和逻辑“或”操作符“|”,如果第一个

27、操作数已能确定运算结果了,则不再计算第二个操作数的值,该规则称为短路求值。 例如: true | x 的结果为 true false & x 的结果为 false 短路求值一方面能够提高逻辑运算的效率,另一方面它也能为逻辑运算式中的其它运算提供一个“卫士”(guard) 例如: (number != 0) & (1/number 0.5),位操作,在C+中提供了对整型和枚举类型数据按操作数的各个二进制位分别进行运算的操作,包括:逻辑位运算和移位运算。 逻辑位操作 (按位取反), &(按位与), |(按位或), (按位异或),0 1,1 0,0|0 0 0|1 1 1|0 1 1|1 1,00

28、0 01 1 10 1 11 0,0&0 0 0&1 0 1&0 0 1&1 1,例: s & 0x10 /判s的第5位(从低位数)是0还是1 s = (s | 0x40) /把第7位设置为1 s = (s & 0xF7) /表示把第4位设置为0,位操作,移位操作 (右移) 左移:把第一个操作数按二进制位依次左移由第二个操作数所指定的位数。左移时,高位舍弃,低位补0。例如: 0x3F61 2的结果为0xFD84 右移:把第一个操作数按二进制位依次右移由第二个操作数所指定的位数。右移时,低位舍弃,高位按下面规则处理: 对于无符号数或有符号的非负数,高位补0 对于有符号数的负数,高位与原来的最高位

29、相同,赋值操作,除了通过输入操作来改变变量的值以外,通常,变量值的改变是通过赋值操作来实现。 简单赋值操作符 a = b 当赋值操作的两个操作数类型不同时,将按赋值转换规则进行隐式类型转换,即,把右边操作数转换成左边的操作数类型。 复合赋值操作符 +=,-=,*=,/=,%=,&=,|=,=,= a #= b 功能上等价于:a = a # b 有时能提高效率 构成了冯诺依曼计算模型的一个重要特征,同时,也构成了冯诺依曼计算的一个瓶颈。,其它操作符,条件操作符(?:) d1?d2:d3 如果d1的值为true或非零,则运算结果为d2,否则为d3。 逗号操作符 d1,d2,d3,. 从左至右依次进

30、行各个运算,操作结果为最后一个运算的结果 逗号操作表示的计算更加清晰 例如:x = a+b, y = c+d, z = x+y sizeof sizeof() 或 sizeof() 计算某类型的数据占用的内存大小(字节数),表达式,定义 表达式是由操作符、操作数以及圆括号所组成的运算式。其中,操作数可以是常量、变量或函数调用,也可以是用圆括号括起来的表达式。例如: (a+b)*c/12-max(a,b) 表达式类型 算术表达式 关系/逻辑表达式 地址表达式等,操作符的优先级和结合性,一个表达式中可以包含多个操作符的运算,先执行哪一个操作符所指定的运算? 对相邻的两个操作符,按下面规则确定: 圆

31、括号:圆括号内的先运算 优先级:优先级高的先运算 结合性:相同优先级按左结合或右结合 例如:a+b*(c-d) 计算次序为:-,*,+ 对不相邻的操作符,C+一般没有规定计算次序(&、|、?:和,操作符除外),例如: (a+b)*(c-d) /C+没有规定+和-的计算次序。,表达式中的类型转换,编译程序常常要对表达式中的操作数进行隐式类型转换,C+的转换过程是逐个操作符进行类型转换。 例如: short int a=2; int b=2147483647; /int类型中最大的正整数 double c=2.0; 表达式:a*b/c将得到错误的结果:-1.0。 解决办法: (double)a*b

32、/c 或 a*(double)b/c 结果为:2147483647.0,表达式的副作用问题,当一个表达式中包含带副作用的操作符时,该表达式的结果有时是不确定的。例如: (x+1)*(+x) 由于C+没有规定操作符+和+谁先计算,因此,不同的编译程序可能会给出不同的实现(假设x初值为1): 先计算+,则结果为:4 先计算+,则结果为:6 因此,应尽量避免把带副作用的操作符用在复杂的表达式中,最好把它们作为单独的操作来用。,表达式的输出,C+提供了多种把计算结果输出到显示器的途径,最典型的途径是利用C+标准库中定义的对象cout和插入操作符“ using namespace std; cout a+b*c; cout a; cout b; cout endl; 或 cout a+b*c a b endl;,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1