单片机C语言课件第2章_第1页
单片机C语言课件第2章_第2页
单片机C语言课件第2章_第3页
单片机C语言课件第2章_第4页
单片机C语言课件第2章_第5页
已阅读5页,还剩66页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第2章 数据类型、运算符 及表达式 2.1 c语言的数据类型 2.1 c语言的数据类型 v基本数据类型最主要的特点是,其值不可以再分解为其他类型。也就是 说,基本数据类型是自我说明的。 v构造数据类型是根据已定义的一个或多个数据类型用构造的方法来定义 的。也就是说,一个构造类型的值可以分解成若干个“成员”或“元 素”。每个“成员”都是一个基本数据类型或又是一个构造类型。在c 语言中,构造类型有以下几种:数组类型、结构体类型、共用体类型等。 v指针是一种特殊的且具有重要作用的数据类型。其值用来表示某个量在 内存储器中的地址。虽然指针变量的取值类似于整型量,但这是两个类 型完全不同的量,因此不能混

2、为一谈。 v空类型 在调用函数值时,通常应向调用者返回一个函数值。这个返回的 函数值是具有一定的数据类型的,应在函数定义及函数说明中给以说明。 但是,也有一类函数,调用后并不需要向调用者返回函数值,这种函数 可以定义为“空类型”,其类型说明符为void。 2.1 c语言的数据类型 基本数据类型类型标识符字节数取 值 范 围 整型int2-215(215-1) 即-3276832767 短整型short int2同int 长整型long int4-231(231-1) 即-21474836482147483647 无符号整型unsigned int20(216-1) 即065535 无符号短整型

3、unsigned short2同unsigned int 无符号长整型unsigned long40(232-1) 即04294967295 有符号整型signed int2同int 有符号短整型signed short2同short int 有符号长整型signed long4同long int 单精度实型(浮点)float410-371038 双精度实型double810-30710308 字符型char1ascii字符代码 无符号字符型unsigned char10255 有符号字符型signed char1-27(27-1) 即-128127 2.2 常量 v在程序执行过程中,其值不发

4、生改变的量称 为常量,在程序中,常量是可以不经说明而 直接引用的,即无须事先加以说明,在使用 时,在程序需要的地方直接写出来即可。c语 言里有如下几种常量:整型常量、实型常量、 字符常量和字符串常量。 2.2.1 整型常量 v值为整数的常量称为整型常量,它包括正整 数、零、负整数,一般认为整型常量就是整 常数。在c语言中,使用的整常数有八进制、 十六进制和十进制3种。 2.2.1 整型常量 v1. 十进制整常量的书写形式 v十进制整常量是通常意义下的整数,例如:122,- 5,0等,其数码为09,在书写时没有前缀,第一 个数字不能是0(除了0本身外)。 v以下各数是合法的十进制整常数:237,

5、-568, 65535,1627。 v以下各数不是合法的十进制整常数:023(不能有 前导0),23d(含有非十进制数码)。 2.2.1 整型常量 v2. 八进制整常量的书写形式 v八进制整常量必须以数字0开头,即以数字0作为八 进制数的前缀。数码取值为07。0113表示八进制 数113,相当于十进制的75;-010表示八进制-10, 即十进制的-8;00表示八进制的0,也就是十进制 的0。 v以下各数是合法的八进制数:015(十进制为13), 0101(十进制为65),0177777(十进制为 65535)。 v以下各数不是合法的八进制数:256(无前缀0), 03a2(包含了非八进制数码)

6、。 2.2.1 整型常量 v3. 十六进制整常量的书写形式 v十六进制整常量的前缀为0 x(数字0和小写字母x),其数码 取值为09,af或af。例如0 x12表示十六进制数12, 相当于十进制的18,-0 x5b是十进制的-91。 v以下各数是合法的十六进制整常数:0 x2a(十进制为42), 0 xa0(十进制为160),0 xffff (十进制为65535)。 v以下各数不是合法的十六进制整常数:5a(无前缀0 x), 0 x3h(含有非十六进制数码)。 v注意:转义符“”后面是十六进制数时,前面要加的标识是 “x”,而不是“0 x”。因此,“x41”是正确的转义字符,代 表字母“a”,

7、而“0 x41”不是转义字符,编译时会给出出错 信息。 2.2.1 整型常量 v在程序中是根据前缀来区分各种进制数的,因此在书写常数时不要把前 缀弄错造成结果不正确。在16位字长的机器上,基本整型的长度也为16 位,因此表示的数的范围也是有限定的。十进制无符号整常数的范围为 065535,有符号数为-32768+32767。八进制无符号数的表示范围 为00177777。十六进制无符号数的表示范围为0x00xffff或0 x0 0 xffff。如果使用的数超过了上述范围,就必须用长整型数来表示。长 整型数是用后缀“l”或“l”来表示的。 v例如:十进制长整常数158l(十进制为158)、八进制长

8、整常数012l (十进制为10)、十六进制长整常数0 x15l(十进制为21)。 v长整数158l和基本整常数158 在数值上并无区别。但对158l,因为是长 整型量,c编译系统将为它分配4个字节的存储空间。而对158,因为是 基本整型,只分配2 个字节的存储空间。因此在运算和输出格式上要予 以注意,避免出错。 2.2.1 整型常量 【例2-1】 编写程序,将十进制整数58,分别按照十进制、 八进制和十六进制的形式输出。 #include stdio.h main() printf(%dn,58); printf(%on,58); printf(%xn,58); 程序运行结果如下: 58 72

9、 3a 2.2.2 实型常量 v实型常量是指值为实数的常量,简称实常量, 实型常量也称为实数或者浮点数。整型常量 有十进制、八进制和十六进制3种书写形式, 而实型常量只有十进制的书写形式。在c语言 中表示十进制的实型常量采用十进制数形式 和指数形式。 2.2.2 实型常量 v1. 十进制数形式 v十进制数形式的实型常量由整数部分、小数点和小 数3部分组成,其中小数点是必须的,整数或小数 部分可以省略。例如:0.0,.25,5.789,0.13, 5.0,300.,-267.8230等均为合法的实型常量。 v注意:300表示整型常量,300.表示实型常量。 v标准c允许浮点数使用后缀。后缀为“f

10、”或“f”即表 示该数为浮点数。如356f和356.是等价的。 2.2.2 实型常量 v2. 指数形式 v指数形式的实型常量由尾数、小写字母e或大写字母e加上指数3部分组 成。e或e必须要有,字母前的尾数必须是数字,可以是整数,也可以是 实数,字母后的指数必须是整数并且可以带“+”符号或“-”符号。其一 般形式为a e n(a为十进制数,n为十进制整数),其值为 a*10n。 v例如2.1e5(等于2.1*105),3.7e-2(等于3.7*10-2),0.5e7(等于 0.5*107)等都是c语言合法的以指数形式表示的实型常量,而e7(e之 前无数字),-5(无字母e),53.-e3(负号位

11、置不对),2.7e(无指数) 等都不是c语言合法的实型常量。 v表示同一个实数,可以用不同的尾数和指数。比如123.45,可以表示为 123.45e0,12.345e1,1.2345e2或0.12345e3等。在所有这些形式中, 如果尾数部分被写成小数点前面有且只有一位非0数字,那么称为规范化 的指数形式,在c语言中,如果以指数形式输出实数时,都是按规范化 的指数形式输出。 2.2.2 实型常量 【例2-2】 编写一个程序,将十进制数123.45,输出一般形式和指数形式。 #include stdio.h main() printf(%fn,123.45); printf(%en,123.45

12、); 程序运行结果如下: 123.450000 1.234500e+002 2.2.3 字符常量 v在c语言中,字符常量是用单引号括起来的一个字符。例如a,b, =,+,?都是合法字符常量。 v字符常量只能用单引号括起来,不能用双引号或其他括号。 v字符常量只能是单个字符,不能是字符串。 v字符可以是字符集中任意字符。但数字被定义为字符型之后就不能按原 数值参与数值运算。如5和5 是不同的,5是字符常量。 vc语言是区分字母大小写的。因此,a和a是两个不同的符号常量。 v程序中书写字符常量时,虽然要用单引号括起来,但单引号只是起一个 标识的作用,并不算字符常量的组成部分。 v字符常量属于字符型

13、(char)数据,在内存中将开辟一个字节来存放字 符,存放的内容是该字符的ascii码值。 2.2.3 字符常量 v作为整常量,c语言用两个字节存放它的数值;作为字符常 量,在一个字节里存放它的ascii码值。如果将整常量的值 限定在ascii码值范围内,那么从整常数的角度看,它是这 个整常数的数值;从字符常数角度看,它是一个字符的 ascii码值,这时候整常量和字符常量可以通用。 v由于转义字符本质上是一个字符,所以转义字符也可以构成 一个字符常量。比如n就是字符常量,表示回车换行。 v注意:如果要得到“”这个字符常量,应该写成,要得到 单引号“”这个字符常量,在程序中应该写成。 2.2.3

14、 字符常量 【例2-3】 阅读程序,思考输出结果。 #include stdio.h main() printf(%dn,118); printf(%cn,118); printf(%cn,a); printf(%dn,a); 第1个printf将118按照整常量输出为118。第2个printf把118看作是一 个字符的ascii码值,因此按%c输出时,输出的是ascii码值为118所 对应的字母“v”。第3个printf是按字符形式输出字符常量a,输出字母a。 第4个printf是要把字符常量按十进制形式输出a的ascii码值,输出97。 2.2.4 字符串常量 v字符串常量是由一对双引号括

15、起来的字符序 列,简称字符串。例如:china、c program、$12.5 等都是合法的字符串常量。 v注意:若双引号内没有包括任何字符,即, 称为空字符串。 2.2.4 字符串常量 v字符串常量和字符常量是不同的量。它们之间主要有以下区 别。 v 字符常量由单引号括起来,字符串常量由双引号括起来。 v 字符常量只能是单个字符,字符串常量则可以含一个或多 个字符。 v 可以把一个字符常量赋予一个字符变量,但不能把一个字 符串常量赋予一个字符变量,在c语言中没有相应的字符串 变量。这是与basic 语言不同的。但是可以用一个字符数组 来存放一个字符串常量。在数组一章内予以介绍。 v 字符常量

16、占一个字节的内存空间。字符串常量占的内存字 节数等于字符串中字节数加1。增加的一个字节中存放字符 0(ascii码为0),这是字符串结束的标志。例如,字符 串 c program在内存中所占的字节为:c program0。 2.2.4 字符串常量 v字符常量a和字符串常量a虽然都只有一个字符, 但在内存中的情况是不同的。a是一个字符变量, 在内存中占一个字节,存放的是a的ascii码值,可 表示为:a;a是一个长度为1的字符串变量,在内 存中占两个字节,第1个字节存放字母a的ascii码 值,第2个字节存放字符串结束符0,可表示为: a0。 v一个字符串中所包含的字符个数,称为字符串长度。 字

17、符串中如果有转义字符,则应该把它视为一个整 体,当作一个字符来计算。 2.2.4 字符串常量 v【例2-4】 分别画出0,0,“0”,0在内存中的存放情 况。 v0是一个整型常量,在内存中要开辟两个字节来存放整型常 量0的数值,如图2-2(a)所示。0是一个字符常量,在内 存里要开辟1个字节来存放其ascii码值(十进制为48,十六 进制为30),如图2-2(b)所示。0是一个长度为1的字符 串常量,在内存中要开辟两个字节来存放字符串0,第1个 字节存放其ascii码值,第2个字节存放字符串结束符号 “0”,如图2-2(c)所示。0是把空字符(null)作为一 个字符,形成一个字符常量,用1个

18、字节存放其ascii码值 (十进制的0),如图2-2(d)所示。 2.2.4 字符串常量 2.3变量 v在程序执行过程中,允许其值发生变化的量,被称为“变 量”。在c语言中,通常用变量来保存程序执行过程中的输 入数据、中间结果及最终结果。 v用户应该为程序中用到的每一个变量起一个名字,以示区别, 为变量取的名字,称为“变量名”。在c语言中,为变量起 名应符合标识符的命名规则,因此,变量名只能以字母或下 画线开头。为了区分是c语言系统本身使用的变量名,还是 程序中用户给变量起的名字,习惯的做法是:c语言系统使 用的变量名,以下画线开头;用户程序中的变量名,以字母 开头。另外,用户为变量起的名字里

19、的英文字母,多用小写。 2.3.1 变量的声明 v在程序中使用一个变量之前,先要对它进行 说明:起一个名字(变量名),指定它的数 据类型。变量说明语句的基本格式为: 数据类型符数据类型符 变量名变量名; 2.3.1 变量的声明 v1整型变量 v用数据类型符int可以将一个变量说明为是整型的。例如: int x; v说明了一个名为x的变量,它的数据类型是整型的。它表示x要在内存中 占用两个字节来存放它的值,它的取值范围是-32768+32767。 v在整型变量说明符int的前面加上修饰符:signed、unsigned、long和 short后,就可以说明一个变量是带符号的、无符号的、长型的和短

20、型的 等。例如: long int y; v说明了一个名为y的变量,它的数据类型是长整型的。它表示y要在内存 中占用4个字节来存放它的值,它的取值范围是-2147483648 +2147483647。 2.3.1 变量的声明 v对于整型变量来说,要注意以下几点。 v 如果在说明一个整型变量时含有修饰符signed、 unsigned、long和short等,那么int可以省略不写。 即:long int y;与long y;所说明的变量含义相同。 v int在前面没有修饰符时,默认为是带符号的。即 int就是signed int。 v signed int与unsigned int的区别在于对

21、数(二进 制)的最高位的解释不同。对于前者,把最高位作 为符号位看待;对于后者,最高位仍用于存储数据。 2.3.1 变量的声明 v2实型变量 v用数据类型符float或double,可以将一个变量说明 为是单精度实型的或双精度实型的。 例如: float x; double y; v其中float x;是把x说明为是单精度实型的,它需要 4个字节来存放自己的取值;double y;是把y说明 为是双精度实型的,它需要8个字节来存放自己的 取值。 2.3.1 变量的声明 v3字符型变量 v用数据类型符char可以将一个变量说明为是 字符型的。例如: char ch1; 说明变量ch1是字符型的,

22、它要在内存中占用 1个字节来存放它的ascii码值。 2.3.1 变量的声明 v关于变量的说明,有如下几点要注意。 v 允许在一个类型说明符后,说明多个相同数据类型的变量。各变量名 之间用逗号间隔。类型说明符与变量名之间至少用一个空格间隔。例如: int a,b,c; v说明了变量a、b和c都是整型的,它们每一个都需要两个内存字节来存 放自己的取值。 v 最后一个变量名之后必须以“;”号结尾。 v 变量说明必须放在变量使用之前,一般放在函数体的开头部分。也就 是说,只有已经说明了的变量,才能在程序中使用;否则由于违反了c 语言的语法规则,程序不会通过编译。 v 在同一个函数中说明变量时,变量名

23、不能相同。 v 在c语言中,只有字符串常量,没有字符串型的变量。之所以这样, 是因为c认为任何一种数据类型的长度都应该是一定的,但字符串的长 度却不能确定,所以不能有这种数据类型的变量。 2.3.2 变量的存储类型 v系统分给用户使用的3个内存空间。 v 应用程序区:用于存放用户程序。 v 静态存储区:用于存放在程序执行的全部 过程中,都需要保存的哪些数据。 v 动态存储区:用于存放在程序执行时,临 时需要保存的哪些数据。 2.3.2 变量的存储类型 v由变量的存储类型来决定一个变量是被分配在内存的静态存 储区还是动态存储区,这一部分在以后的章节中有更加详细 的介绍。如表2-2所示给出了c语言

24、的存储类型符。为了说明 一个变量的存储类型,只需在变量说明语句里添加存储类型 符即可。这时的变量说明语句格式为: 存储类型符 数据类型符 变量名; 例如 static int a; auto float b; v使c的编译程序在内存的静态存储区为变量a分配两个字节的 存储区,在内存的动态存储区为变量b分配4个字节的存储区。 2.3.2 变量的存储类型 存储类型符存储类型存储位置 auto自动动态存储区 register寄存器通用寄存器 static静态静态存储区 extern外部静态存储区 2.3.2 变量的存储类型 v1自动型变量 v把存储类型符auto加在变量名及其类型前面,该变量就成为一

25、个自动型 变量,简称自动变量。c语言在动态存储区里为其分配存储区。对于自 动变量,有如下几点要注意。 v 自动变量只能在函数内说明。 v 如果一个变量是自动型的,那么保留字auto可以省略不写。也就是说, 只要一个变量在函数内部被说明,并且没有显式给出其存储类型,那么 就默认它是自动型,前面我们所举例子中的变量,都属于自动型。 v 在不同函数中说明的自动变量,可以使用相同的名字,它们的类型可 以相同,也可以不同,彼此不会产生干扰。这是因为调用一个函数时, 才为它里面的自动变量在动态存储区里分配存储区;退出函数时,所占 用的存储区就立即归还。在以后的章节里还会详细地介绍这方面的问题。 2.3.2

26、 变量的存储类型 v2寄存器型变量 v把数据存放在寄存器里,操作起来比在内存里快,这是因为把一个变量 说明为是寄存器型的,这样编译程序就会把该变量放在cpu的一个通用 寄存器中参与操作。例如: register int a; 就把变量a说明为是一个寄存器型的整变量。 对于寄存器型变量,需要注意以下几点。 v 只能在函数的内部说明寄存器型变量。 v 程序中不能同时说明太多的寄存器型变量,一般以两个为宜,这是因 为通用寄存器数量有限。如果超出,编译程序会把它们设为自动型变量。 v 不能把long、float和double型的变量定为寄存器型。 v实际上,经过优化的编译程序,会判别使用频繁的变量并自

27、动存放到寄 存器中,因此,现实程序中极少使用寄存器型变量。 2.3.2 变量的存储类型 v3静态型变量 我们把存储类型符static加在变量名及其类型前面, 例如:static int x;该变量就成为一个静态型变量, 简称“静态变量”。c语言在静态存储区里为静态 变量分配存储区。在整个程序运行期间,静态变量 会一直占据分配给它的存储区,直到程序运行结束。 v4外部型变量 我们把存储类型符extern加在变量名及其类型前面, 例如:extern int x;该变量就成为一个外部型变量, 简称“外部变量”。c语言在静态存储区里为外部 变量分配存储区 2.3.3 变量的初始化 v变量的初始化是指在

28、对变量进行说明的同时 给变量赋值。其格式为: 存储类型符 数据类型符 变量名=常量; 2.3.4 变量地址与取地址符 v这里,y将被赋予0,因为x为50,表达式1的 值为假,将表达式3的值0赋予y,如果x=80, y将被赋予100。因此可以看出“?”运算符可 以代替某些if-else形式的语句。 2.4.5 条件运算符与条件表达式 在处理条件表达式时需要注意以下几点。 v 在条件表达式中,“表达式1”是条件表达式,而“表达式2”和“表达 式3”可以是其他的表达式。 v 条件表达式允许嵌套,这种嵌套是右结合的,即先计算右边的条件表 达式。 v例如: int a,b,c,d,e; a=15; b=

29、20; c=25; d=30; e=ad?b:d; 2.4.5 条件运算符与条件表达式 v【例2-11】 编写程序,从键盘接收输入的字符。如果字符是英文小写字 母,则将其转换成大写后输出,否则输出原字符。 #include stdio.h main() char x; char ch; printf(please enter a character!); scanf(%c, ch=(x=a printf(%c,ch); 2.4.6 逗号运算符与逗号表达式 v逗号运算符就是把逗号(,)作为运算符,利用它 来把若干个表达式“连接”在一起。这样构成的表 达式整体,称为“逗号表达式”。逗号表达式的一

30、般格式为: 表达式1,表达式2,表达式3,表达式n v逗号表达式的执行过程是:从左到右顺序计算各个 表达式的值,并且把最右边表达式的值作为该逗号 表达式的最终取值。也就是说,“表达式n”的值是 整个逗号表达式的值。 2.4.6 逗号运算符与逗号表达式 关于逗号表达式,要注意以下几点。 v 逗号表达式是可以嵌套的。 v 程序中使用逗号表达式,通常是分别求逗 号表达式内各表达式的值,并不一定要求整 个逗号表达式的值。 v 并不是所有出现逗号的地方都组成逗号表 达式,如在变量说明中、函数参数表中逗号 只是用作各变量之间的间隔符。 2.4.7 位运算符 v位逻辑运算符 如表2-9所示列出了c语言中的

31、位逻辑运算符及其含义。从表中看出,c语言 中的位逻辑运算符,除了“位非”外,都是 双目的。由于它都是按照二进制的相应位一 位一位地进行运算,所以称它们是位逻辑运 算符。由位逻辑运算符和运算对象构成的表 达式,称为“位逻辑表达式”。 2.4.7 位运算符 表2- -9 c语言中的位逻辑运算符及其含义 名 称运 算 符运算对象个数含 义 位非单目相应位是1为0;相应位是0为1 位与&双目相应位都是1,才是1,否则为0 位或|双目相应位只要有一个为1,就是1 位异或双目相应为不同,为1,否则为0 2.4.7 位运算符 v位非运算符“”为单目运算符,具有右结合性。其功能是 对参与运算的数的各二进位按位

32、求反。 v位异或运算符“”是双目运算符。其功能是参与运算的两个 数各对应的二进位相异或,当两个对应的二进位相异时,结 果为1,否则为0。参与运算数仍以补码出现。 v位或运算符“|”是双目运算符。其功能是参与运算的两个数 各对应的二进位相或。只要对应的两个二进位有一个为1时, 结果位就为1,否则为0。参与运算的两个数均以补码出现。 v位与运算符“&”是双目运算符,其功能是参与运算的两个数 各对应的二进位相与。只有对应的两个二进位均为1时,结 果位才为1,否则为0。参与运算的数以补码方式出现。 2.4.7 位运算符 v移位运算符 v“左移”和“右移”两个移位运算符都是双目的。由移位运 算符和运算对象构成的表达式,称为“移位表达式”。如表 2-10所示列出了c语言中的移位运算符及其含义。 表2- -10 c语言中的移位运算符及其含义 名 称运 算 符运算对象个数含 义 左 移双目右移若干位 2.4.7 位运算符 1.左移位运算符 v由左移位运算符构成的移位表达式一般为: 表达式n v其中“表达式”

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论