1、 第二章 数据描述与基本操作 本章主要内容 2.1 工作场景导入 2.2 数据类型 2.3 运算符与表达式 2.4 不同类型数据间的混合运算 2.5 回到工作场景 2.1工作场景导入 知 识 结 构 框 图 整 型 实 型(单 精 度,双 精 度)字 符 型 枚 举 类 型 数 组 类 型 构 造 类 型 结 构 体 类 型 共 用 体 类 型 指 针 类 型 空 类 型 算 术 表 达 式 赋 值 表 达 式 运 算 表 达 式 关 系 表 达 式 逻 辑 表 达 式 逗 号 表 达 式 数 据 类 型 转 换(自 动 类 型 转 换 和 强 制 类 型 转 换)数据描述和基 本 操 作 数
2、 据 类 型 基 本 类 型 运 算 表 达 式 构 造 类 型 2.1.1 Windows XP的启动【工作场景】甲乙两人在玩一简单的数字游戏,首先甲对一个4位整数进行变化,再告诉乙其所用的变化规则,然后由乙来推测变化之前的数值是多少。设甲的变化规则为:首先对该数值的各位数字逆序,然后用新数上的每一位数字加5后余上10后的余数代替各位上的数字。试推测出原来的数字。现假设所给数据为6382,程序运行结果如下图所示。NoImage【引导问题】(1)变量该如何定义,标识符命名规则是什么?(2)所给数字是常量还是变量,按常量存储还是按变量存储?(3)各种运算符该如何选择?加减乘除、取余数等各种运算符
3、该如何表示?(4)如何实现换行,比如,如图2.1所示的换行?(5)如何判断所给数据是整型、浮点型还是字符型等?不同类型的数据该如何转换?(6)变量和赋值运算有什么关系?2.2 数据类型知 识 结 构 框 图 整 型 实 型(单 精 度,双 精 度)字 符 型 枚 举 类 型 数 组 类 型 构 造 类 型 结 构 体 类 型 共 用 体 类 型 指 针 类 型 空 类 型 算 术 表 达 式 赋 值 表 达 式 运 算 表 达 式 关 系 表 达 式 逻 辑 表 达 式 逗 号 表 达 式 数 据 类 型 转 换(自 动 类 型 转 换 和 强 制 类 型 转 换)数据描述和基 本 操 作 数
4、 据 类 型 基 本 类 型 运 算 表 达 式 构 造 类 型 2.2.1 常量与变量1.标识符名标识符是由程序员按照命名规则自己定义的词法符号,用于定义宏名、变量名、函数名以及自定义函数名等。C语言中标识符的命名规则如下:标识符只能由字母、数字和下划线三种字符构成。标识符的有效长度为132个字符。标识符的第一个字符必须是字母或下划线,后续字符可以是字母、数字或下划线。标识符中大写字母和小写字母被认为是不同的字符。如my、My、MY是3个不同的标识符。标识符不能与任何关键字相同。下表列举了几个合法的和非法的标识符名称。2.常量常量是指那些在程序运行过程中不改变其值的量。通常常量分为以下5种类
5、型。(1)整型常量:整型常量包括长整数(long)、短整数(short)、有符号整数(int)和无符号整数。常量有3种形式,即十进制整型常量、八进制整型常量和十六进制整型常量。(2)实型常量:主要有小数表示形式和指数表示形式两种。(3)字符常量:字符型常量包括普通字符常量和转义字符常量。下表列出了C语言中常用的控制字符。float char、short int double long unsigned 级别低 级别高(4)字符串常量:字符串常量是由一对双引号括起来的零个或多个字符序列组成的。注意与字符常量的区别。如“china”、“How are you!”等。(5)符号常量:在C语言中,常量
6、可以用符号来命名,这样的常量称为符号常量。符号常量是用#define命令定义的,例如,在程序首部写上#define PI 3.1415926,这表示PI就是3.1415926,符号常量也是常量,所以不能在程序中被再定义。符号常量用大写字母表示,变量用小写字母表示,以示区别。3.变量变量是在程序运行中其值可以被修改的量。变量具有3个基本要素:变量说明、变量类型和变量值。在C语言中,如果要用到变量,则必须先对变量进行类型定义,然后才能使用。这就叫强制定义。C语言规定变量的定义形式为:数据类型 变量名列表;这里的数据类型是指C语言的有效数据类型,基本包括整型(int)、字符型(char)和浮点型(f
7、loat)。变量名列表中,变量与变量之间用逗号隔开。例如:int i,j,k;2.2.2 整型数据整型数据分为整型常量和整型变量。1.整型变量的定义对于任何一个变量来说,在使用之前必须先定义。定义整型变量的使用格式:数据类型 变量1,变量2,变量3,.;例如:int a,b;/*定义两个整型变量a、b*/long c,d,f;/*定义三个长整型变量c、d、f*/unsigned e;/*定义一个无符号型变量e*/2.整型变量的分类整型变量的基本类型符为int,在int之前可以根据需要分别加上修饰符short(短整型)或long(长整型),形成以下4类整型的变量:基本类型以int表示。短整型类型
8、说明符为short int或int。长整型类型说明符为long int或long。无符号型类型说明符为unsigned。以上数据类型的具体情况见表2.3。2.2.3 实型数据实型数据表示的是小数的数值。实型常量是一种在程序运行过程中不改变其值的实型数据。实型常量在C语言中又叫浮点数。在程序运行过程中其值改变的实型数据称为实型变量。实型变量分为单精度和双精度两种类型,分别使用关键字float和double来定义,它们的分类情况见下表。定义的格式如下:float x;/*定义x变量是用来表示float数据的*/double y,z;/*定义y、z变量是用来表示double数据的*/NoImage2
9、.2.4 字符型数据1.字符串常量字符串常量是一对双引号括起来的字符序列。正如字符常量是由一对单引号括起来的单个字符一样,C语言除了允许使用字符常量外,还允许使用字符串常量。字符串常量的输出格式如下:printf(Hello,world!);不要把字符常量与字符串常量混淆。例如c是字符常量,而“c”是字符串常量,二者是不同的。例如下面的写法是正确的:char x1;/*定义一个字符变量*/x1=c;/*将字符常量C赋值给变量x1*/而如下写法是错误的:x1=c;/*不能将字符串常量赋值给字符变量*/2.字符变量字符变量用来存放字符,用关键字char说明,每个字符变量中只能存放一个字符。例如:c
10、har c1,c2,c3;表示c1、c2、c3为字符变量,可以用下面的语句对c1、c2、c3赋值:c1=a;c2=b;c3=c;将一个字符赋给一个字符变量时,并不是将该字符的本身存储到内存中,而是将该字符的ASCII码存储到内存单元中。例如,字符A的ASCII码为65,在内存中的存放形式如下:010000012.3 运算符与表达式 知 识 结 构 框 图 整 型 实 型(单 精 度,双 精 度)字 符 型 枚 举 类 型 数 组 类 型 构 造 类 型 结 构 体 类 型 共 用 体 类 型 指 针 类 型 空 类 型 算 术 表 达 式 赋 值 表 达 式 运 算 表 达 式 关 系 表 达
11、 式 逻 辑 表 达 式 逗 号 表 达 式 数 据 类 型 转 换(自 动 类 型 转 换 和 强 制 类 型 转 换)数据描述和基 本 操 作 数 据 类 型 基 本 类 型 运 算 表 达 式 构 造 类 型 运算符也称为操作符,它是对程序中的数据进行运算的标志符号,参与运算的数据称为操作数或运算对象。由运算符和操作数组成的符合语法规则的序列称为表达式,表达式经运算后得到一个结果值。单目运算:-a中单目运算符为“-”。双目运算:a+b中双目运算符为“+”。三目运算符:ab?a:b中三目运算符为“?:”。1.算术运算符C语言的算术运算符共有7个,对应9种运算,根据运算对象的个数,可分为双目
12、运算符和单目运算符。各运算符的含义下表。2.3.1 算术运算符与算术表达式 基本的算术运算符如下:加法运算符(+)。加法运算符为双目运算符,即应该有两个变量参加加法运算。减法运算符(-)。减法运算符为双目运算符。但“-”也可以做负值运算符,此时为单目运算符。乘法运算符(*)。它是双目运算符。除法运算符(/)。它是双目运算符。参与运算量均为整型时,结果为整型,舍去小数。如果运算量中有一个是实型,则运算结果为双精度型。单目运算符正(+),负(-)。运算时不改变运算对象的值。2.算术运算符的运算优先级和结合性下表给出了算术运算符的优先级和结合性。NoImage3.自增自减运算符在C语言中还有两个很有
13、用的运算符,即增1和减1运算符+和-。运算符+是给它的操作数加1,而-是减1。归纳如下:+a。先使a的值加1,再使用变量a。-a。先使a的值减1,再使用变量a。a+。先使用变量a的值,再使a的值加1。a-。先使用变量a的值,再使a的值减1。4.算术表达式由算术运算符和圆括号将运算对象连接起来的符合C语言语法规则的式子,称为算术表达式。数学中的代数式在程序中就必须用算术表达式来表示,如下表所示。NoImage2.3.2 赋值运算符与赋值表达式 1.赋值运算符C语言包括基本运算符和复合运算符两种赋值运算符。(1)基本赋值运算符形式:=功能:将赋值运算符右边的表达式的值赋给其左边的变量。(2)复合赋
14、值运算符 形式:算术运算符=功能:对赋值运算符左右两边的运算对象进行指定的算术运算符的运算,再将运算结果赋予左边的变量。由赋值运算符和操作数组成的符合语法规则的序列称为赋值表达式。赋值表达式的计算顺序是从右向左进行的,运算结果取左值表达式的值。形式:变量 赋值运算符 表达式对赋值表达式的理解过程是:将赋值运算符右侧的表达式的值赋给左侧的变量,赋值表达式的值就是被赋值的变量的值。赋值表达式也可以包含复合的赋值运算符。2.3.3 逗号运算符与逗号表达式 由逗号运算符和操作数组成的符合语法规则的序列称为逗号表达式,其作用是将若干个表达式连接起来。它们的优先级别在所有的运算符中是最低的,结合方向是从左
15、到右。逗号表达式的一般形式为:表达式1,表达式2,表达式3,.,表达式n运算过程为:依次计算表达式1的值,再计算表达式2的值,直至计算完所有的逗号表达式。整个表达式的值为表达式n的值。2.4 不同类型数据间的混合运算 知 识 结 构 框 图 整 型 实 型(单 精 度,双 精 度)字 符 型 枚 举 类 型 数 组 类 型 构 造 类 型 结 构 体 类 型 共 用 体 类 型 指 针 类 型 空 类 型 算 术 表 达 式 赋 值 表 达 式 运 算 表 达 式 关 系 表 达 式 逻 辑 表 达 式 逗 号 表 达 式 数 据 类 型 转 换(自 动 类 型 转 换 和 强 制 类 型 转
16、 换)数据描述和基 本 操 作 数 据 类 型 基 本 类 型 运 算 表 达 式 构 造 类 型 2.4.1 隐式类型转换在隐式类型转换中有如下规则:如参与运算的运算量的类型不同,则先转换成同一类型,然后进行运算。转换按数据长度增加的方向进行,以保证不降低精度。所有的浮点运算都是以双精度进行的,即使仅含有float(单精度)型运算的表达式,也要先转换成double型,再作运算。char型和short型参与运算时,将其先转换成int型。2.4.1 隐式类型转换在赋值运算中,赋值运算符两边的数据类型不同时,赋值运算符右边量的类型先转换成左边量的类型。如果右边量的数据类型长度比左边长时,将丢失一部
17、分数据,这会降低精度,丢失的部分按四舍五入向前舍入。右图解释了隐式类型转换的规则。图中的横向箭头表示必定转换,纵向箭头表示当运算对象为不同类型时转换的方向。2.5 回到工作场景 知 识 结 构 框 图 整 型 实 型(单 精 度,双 精 度)字 符 型 枚 举 类 型 数 组 类 型 构 造 类 型 结 构 体 类 型 共 用 体 类 型 指 针 类 型 空 类 型 算 术 表 达 式 赋 值 表 达 式 运 算 表 达 式 关 系 表 达 式 逻 辑 表 达 式 逗 号 表 达 式 数 据 类 型 转 换(自 动 类 型 转 换 和 强 制 类 型 转 换)数据描述和基 本 操 作 数 据
18、类 型 基 本 类 型 运 算 表 达 式 构 造 类 型 通过对2.22.4节的学习,我们了解了各种数据类型、运算符以及表达式的使用方法。对于工作场景所提的问题,很容易在上文找到答案。现在让我们回过头来完成本章开始的工作场景部分。(1)因为原变化规则为先将个位上的数字逆序,故我们会想到将变化后的数字逆序。(2)因为变化规则是将各位上的数字加5后余10,故我们要将各位数字减5后再余10,但由于若将各位数字直接减5后再余10会得到负值,故我们应先将各位数字加10后再减5余10,即:加5余10。2.6 工作实训营1.训练内容编程验证如下性质:对于任意一个整数,用该整数和任何其他的整数n进行异或操作得到一个结果后,可以再将此结果和n进行异或操作,得到原来的整数。然后,利用该结论推测如下结论是否正确:对于任意一个整数,用该整数分别和任何其他的两个整数n1和n2进行异或操作,但使用不同的反异或顺序时,所得到的结果是否与原数值一致?2.训练目的熟悉各种数据类型和运算符的使用,掌握基本表达式的使用方法和含义。本 章 小 结 本章主要介绍了各种数据类型、运算符和表达式。同时,还简要叙述了不同数据类型进行相互运算时的类型转换问题。可以认为本章的内容是C语言至关重要的基础,应该引起我们足够的重视。本章的知识结构如下图所示。