1、微机原理及单片机接口技术微机原理及单片机接口技术第五章第五章 单片机的单片机的C语言程序语言程序设计及仿真调试设计及仿真调试任课教师: http:/ stc15系列单片机器件手册等keil vision软件下载及指导手册(Helpvision Help) http:/ Software Cx51 编译器用户手册: Cx51编译器-对传统和扩展的8051微处理器的优化的C编译器和库参考2第五章第五章 单片机的单片机的C语言程序设计及仿真调试语言程序设计及仿真调试本章学习目标本章学习目标掌握单片机掌握单片机C语言程序中的常用功能语言程序中的常用功能掌握掌握Keil C的程序设计的程序设计掌握掌握I
2、AP15W4K58S4单片机单片机C语言程序调试过程语言程序调试过程3第五章第五章 单片机的单片机的C语言程序设计及仿真调试语言程序设计及仿真调试5.1 C515.1 C51程序的基本语法程序的基本语法5.1.1 5.1.1 关键字关键字 5.1.2 C515.1.2 C51程序的一般结构程序的一般结构5.1.3 5.1.3 数据类数据类型型 5.1.4 5.1.4 运算符和表达式运算符和表达式5.2 Keil C515.2 Keil C51程序的语句程序的语句5.2.1 5.2.1 表达式语表达式语句句 5.2.2 5.2.2 条件语句条件语句5.2.3 5.2.3 开关语开关语句句 5.2
3、.4 5.2.4 循环语句循环语句5.2.5 goto5.2.5 goto、breakbreak、continuecontinue和和returnreturn语句语句 5.3 5.3 函数函数 5.3.1 5.3.1 函数的定义与调用函数的定义与调用 5.3.2 Keil C515.3.2 Keil C51函数函数5.4 Keil C515.4 Keil C51库函数库函数5.5 5.5 预处理命令预处理命令5.6 5.6 单片机单片机C C语言程序框架语言程序框架4汇编语言和汇编语言和C语言的选择问题语言的选择问题设计规模较小的嵌入式应用系统时,可以使用设计规模较小的嵌入式应用系统时,可以使
4、用汇汇编语言编语言。因为代码一般不长,且较简单。因为代码一般不长,且较简单。当程序比较复杂,且没有很好的注释时,使用汇当程序比较复杂,且没有很好的注释时,使用汇编语言编写的程序,编语言编写的程序,可读性和可维护性会很差,可读性和可维护性会很差,代码的可重用性也比较低。代码的可重用性也比较低。使用使用C语言编程,编写简单、直观易读、便于维护、语言编程,编写简单、直观易读、便于维护、通用性好通用性好。在控制任务比较复杂或者具有大量运算的系统中,在控制任务比较复杂或者具有大量运算的系统中,C语言优势明显。语言优势明显。由于模块化由于模块化,用,用C语言编写的程语言编写的程序具有很好的序具有很好的可移
5、植性可移植性。55.1 C515.1 C51程序的基本语法程序的基本语法1标准标准C语言(语言(ANSI C)的关键字)的关键字(1) 数据类型关键字数据类型关键字 1)基本数据类型)基本数据类型 void、char、int、float、double 2)类型修饰关键字)类型修饰关键字 short、long、signed、unsigned 3)复杂类型关键字)复杂类型关键字 struct、union、enum、typedef、sizeof 4)存储级别关键字)存储级别关键字 auto、static、register、extern、const、volatile5.1.1 5.1.1 关键字关键字
6、65.1.1 5.1.1 关键字关键字(2)流程控制)流程控制关键字关键字1)跳转结构)跳转结构 return 、 continue 、 break 、 goto2)分支结构)分支结构 if 、 else 、 switch 、 case、 default3)循环结构)循环结构 for 、 do 、 while2Keil C51编译器支持的关键字编译器支持的关键字 bit、sbit、sfr、sfr16、data、bdata、idata、pdata、 xdata、 code、 interrupt、 reentrant、 using7预处理命令预处理命令 /以以#开头的命令,用于包含头文件、定义常数
7、等开头的命令,用于包含头文件、定义常数等全局变量声明全局变量声明 /全局变量虽然方便传递参数,但不宜多全局变量虽然方便传递参数,但不宜多函数函数1的声明的声明.函数函数n的声明的声明void main(void)/主函数主函数 局部变量声明局部变量声明 /局部变量只能在所定义的函数内部引用局部变量只能在所定义的函数内部引用 可执行语句可执行语句 函数调用函数调用 无限循环无限循环5.1.2 C515.1.2 C51程序的一般结构程序的一般结构8/一般函数的定义一般函数的定义函数函数1(形式参数声明)(形式参数声明)局部变量声明局部变量声明可执行语句可执行语句.函数函数n(形式参数声明)(形式参
8、数声明)局部变量声明局部变量声明可执行语句可执行语句5.1.2 C515.1.2 C51程序的一般结构程序的一般结构9/中断函数的实现中断函数的实现void ISRname(void) interrupt n /n为中断号为中断号 局部变量声明局部变量声明 可执行语句可执行语句注意如下几点:注意如下几点:(1)所有函数以花括号)所有函数以花括号“”开始,以花括号开始,以花括号“”结束,结束,包含在包含在“ ”内的部分称为函数体。花括号必须成对内的部分称为函数体。花括号必须成对出现,如果一个函数内有多对花括号,则最外层的花出现,如果一个函数内有多对花括号,则最外层的花括号为函数体的范围。为了增加
9、程序的可读性,应采括号为函数体的范围。为了增加程序的可读性,应采用缩进方式书写。用缩进方式书写。5.1.2 C515.1.2 C51程序的一般结构程序的一般结构10注意如下几点:注意如下几点:(2)建议一行写一条语句,每条语句最后必须以一)建议一行写一条语句,每条语句最后必须以一个分号个分号“;”结尾。结尾。(3)每个变量必须先定义后引用每个变量必须先定义后引用。在函数内部定义。在函数内部定义的变量为局部变量,又称为的变量为局部变量,又称为内部变量内部变量,只有定义它,只有定义它的那个函数才能使用。在函数外部定义的变量为全的那个函数才能使用。在函数外部定义的变量为全局变量,又称为局变量,又称为
10、外部变量外部变量,在定义它的那个程序文,在定义它的那个程序文件中的函数都可以使用。件中的函数都可以使用。(4)程序语句的)程序语句的注释注释放在双斜杠放在双斜杠“/”之后之后,或者放,或者放在在“/*.*/”之内。之内。5.1.2 C515.1.2 C51程序的一般结构程序的一般结构111常量和变量常量和变量常量常量包括包括整形常量、浮点型常量、字符型整形常量、浮点型常量、字符型常量常量(如如a: 单单引号引号字符字符 ) 及及字符串字符串常量常量(双双引号单个或多个字符引号单个或多个字符,如如 a, Happy)等。等。变量变量是一种在程序执行过程中其值不断变化的量。是一种在程序执行过程中其
11、值不断变化的量。使用一个变量之前,必须先进行定使用一个变量之前,必须先进行定义。义。5.1.3 5.1.3 数据类型数据类型 1 1常量和变量常量和变量2数据类型数据类型(1)基本数据类型)基本数据类型基本数据类型是不可以再分解为其他类型的数据基本数据类型是不可以再分解为其他类型的数据类型。如类型。如char (字符型字符型)、int(整型整型)、long(长整型长整型)、float (浮点型浮点型)等。等。122数据类型数据类型(2)构造数据类型)构造数据类型构造数据类型是构造数据类型是根据已定义的一个或多个数据类根据已定义的一个或多个数据类型用构造型用构造的方法来定义的的方法来定义的。5.
12、1.3 数据类型数据类型 2 2数据类型数据类型 在在C语言中,构造类型有以下几种:语言中,构造类型有以下几种: 数组类型数组类型 结构类型结构类型 联合类型联合类型13(3)指针类型)指针类型指针是一种特殊的,具有重要作用的数据类型。指针是一种特殊的,具有重要作用的数据类型。用来用来表示某个量在内存中的地址表示某个量在内存中的地址。5.1.3 数据类型数据类型 2 2数据类型数据类型(4)空类型)空类型函数调用后并不需要向调用者返回函数值,函数调用后并不需要向调用者返回函数值, 这种函数可以定义为这种函数可以定义为“空类型空类型”。其类型说明符。其类型说明符为为void。14C51编译器除了
13、支持上述数据类编译器除了支持上述数据类型外型外, 还还支持以下几支持以下几种扩充数据类型:种扩充数据类型:(1)bit:位类:位类型型。bit型变量的位地址由编译器型变量的位地址由编译器分配。分配。(2)sfr:特殊功能寄存器,用来控制中断、定时器、:特殊功能寄存器,用来控制中断、定时器、计数器、串口、计数器、串口、I/O及其他部件及其他部件。(3)sfr16:16位特殊功能寄存器位特殊功能寄存器。(4)sbit:位寻:位寻址址。5.1.3 数据类型数据类型 2 2数据类型数据类型bit与与sbit的用法区别的用法区别:定义的定义的bit型变量型变量的位地址在的位地址在00H7FH之间之间,
14、具体地址值不定具体地址值不定, 由编译器随机分配。由编译器随机分配。sbit位寻位寻址址:该数据:该数据类型类型用一个指定的变量作为基地址用一个指定的变量作为基地址 然后然后用其位的位用其位的位置来得到一个实际的位地置来得到一个实际的位地址。址。15(1)bit:位类位类型型。可以定义一个可以定义一个位变量位变量, 但但不能定义位指不能定义位指针针, 也也不不能定义能定义位数组。位数组。 C51程序中程序中, 函函数参数参数和返数和返回回值也可以是值也可以是位变位变量。例:量。例:bit finish_flag=0; bit testfunc(bit var1, bit var2) . ret
15、urn(0); ; 5.1.3 数据类型数据类型 2 2数据类型数据类型所有所有bit型变量型变量的都被定位在的都被定位在8051片片内内RAM的的可位寻可位寻址区址区20H2FH, 共共16个字节个字节, 所以最多只能声明所以最多只能声明128个个bit型位变量。型位变量。16(2)sfr:字节寻址。语法如下:字节寻址。语法如下: sfr sfr_name = int_constant;如如 sfr P0=0 x80; 0 x80为为P0口的口的地地址址, “=”后为后为常常数数, 且且这个常数这个常数必须必须在特殊功能寄存器的地址范在特殊功能寄存器的地址范围围内内, 即即0 x80到到0
16、xFF之间。之间。5.1.3 数据类型数据类型 2 2数据类型数据类型(3) sfr16:字寻址:字寻址如如sfr16 DPTR=0 x82; 指定指定DPTR的地址的地址DPL=0 x82,DPH=0 x83。(4)sbit:位寻址:位寻址。用于定义可位寻址变量。可定义用于定义可位寻址变量。可定义8051片片内内RAM的的可寻址位可寻址位, 或特殊功能寄存器或特殊功能寄存器的的可寻可寻址位。址位。175.1.3 数据类型数据类型 2 2数据类型数据类型(4) sbit:位寻址。定义:位寻址。定义可位寻址变量可位寻址变量。定义。定义片内片内RAM的的可寻址位可寻址位, 或或特殊功能寄存器的特殊
17、功能寄存器的可寻址位可寻址位。C51编译器提供了编译器提供了存储类型存储类型bdata, bdata存储类型存储类型变量位变量位于片内于片内RAM的可位寻址区的可位寻址区, 可字节寻址可字节寻址, 或位寻址或位寻址, 因此因此bdata型变量可型变量可用用sbit指定指定其中任意位为其中任意位为可位寻址变量可位寻址变量。需注意:使用需注意:使用bdata和和sbit定义的变量必须是定义的变量必须是全局变全局变量量, 并且用并且用sbit定义为位寻址变量时要求定义为位寻址变量时要求基址对象基址对象的存储器的存储器类型必类型必须为须为bdata (特殊功能寄存器除外特殊功能寄存器除外)。sbit声
18、明方法声明方法: sbit bitname=bdata型变量型变量或或sfr_name bit_number;其中其中, sfr_name 是已定是已定义义SFR的名字的名字, bit_number是是位号位号, 其其数值取决数值取决于于基址对象基址对象的数据类型的数据类型, 对对char和和SFR 而言是而言是(07) ,对对int型型而而言是言是(015) ,对对long型型而言是而言是(031) 。185.1.3 数据类型数据类型 2 2数据类型数据类型sbit声明方法声明方法: sbit bitname=bdata型变量型变量或或sfr_name bit_number; 其其中中, s
19、fr_name 是已定义是已定义SFR的名字的名字, bit_number是位号是位号, 其数值取决于其数值取决于基址对象基址对象的数据类型的数据类型, 对对char和和SFR 而言而言是是(07) ,对对int型型而言是而言是(015) ,对对long型型而言是而言是(031) 。如如:unsigned char bdata flag ; /flag为为bdata型型无符号字符变量无符号字符变量 int bdata ibase ; /定义定义ibase为为bdata整型整型变量变量 使使用用sbit可位可位寻址变量如下寻址变量如下: sbit flag0=flag0 ; /定定义义flag0
20、为为flag的第的第0位位 sbit mybit15=ibase15 ; /mybit15为为ibase的第的第15位位 sbit CY=PSW7 ;/定义定义CY为为PSW的第的第7位位 sbit P00=P00 ;/定定义义P0.0口线口线的名称是的名称是P0019sbit可以有下面声明方法:可以有下面声明方法:n方法方法1:sbit bitname=sfr_namebit_number; 其中,其中,sfr_name必须是已定义的必须是已定义的SFR的名字的名字, bit_number是位号(是位号(07)。)。 如:如:sbit CY=PSW7;/定义定义CY为为PSW的第的第7位。位
21、。方法方法2:sbit bitname=sfr_addressbit_number; 其中,其中,sfr_address是是SFR所在的地址(所在的地址(0 x800 xff), bit_number是位号(是位号(07)。)。 如:如:sbit OV=0 xD02;/定义定义PSW中的中的OV位位方法方法3:sbit bitname=bit_address; 其中,其中,bit_address是位地址。是位地址。 如:如:sbit EA=0 xAF;/第第0 xAF位为位为EA5.1.3 数据类型数据类型 2 2数据类型数据类型20Keil C51编译器支持的数据类型如表编译器支持的数据类型
22、如表5-1所示。所示。数据类型数据类型位位数数(bit) 字节字节数数(byte)取值范围取值范围bit11/80或或1signed char81-128+127unsigned char810255enum8/161or2- 1 2 8 + 1 2 7 o r -32768+32767signed short162-32768+32767unsigned short162065535signed int162-32768+32767unsigned int162065535signed long324-2147483648+2147483647unsigned long32404294967
23、295float324+1.175494E38+3.402823E+38sbit11/80或或1sfr810255sfr16162065535表表5-1 Keil C51编译器支持的数据类型编译器支持的数据类型5.1.3 数据类型数据类型 2 2数据类型数据类型213存储器类型存储器类型存储器类型存储器类型取值范围取值范围data默认存储器类型,默认存储器类型,低低128字节字节内部内部RAM,DATA区区(00H7FH地址空间地址空间),访问速度最快。,访问速度最快。bdata可位寻址内部可位寻址内部RAM,BDATA区(区(20H2FH地址空地址空间),允许位和字节混合访问。间),允许位和
24、字节混合访问。idata256字节内部字节内部RAM,IDATA区(区(00HFFH地址空地址空间),允许访问全部内部单元。间),允许访问全部内部单元。pdata分页分页寻址外部寻址外部RAM,PDATA区(区(0000HFFFFH地地址空间),用址空间),用MOVX Ri指令访问。指令访问。xdata外部外部RAM,XDATA区(区(0000HFFFFH地址空间),地址空间),用用MOVX DPTR指令访问。指令访问。code程序存储区程序存储区,CODE区(区(0000HFFFFH地址空间),地址空间),用用MOVC A+DPTR指令访问。指令访问。表表5-2 Keil C515-2 Ke
25、il C51编译器支持的存储器类型编译器支持的存储器类型对变量定义格式:对变量定义格式:数据类型数据类型 存储器类型存储器类型 变量名表变量名表; 5.1.3 数据类型数据类型 3 3存储器类型存储器类型 例如例如: unsigned char data buffer;22存储类型的指定存储类型的指定: 变量或参数的存储类型可由变量或参数的存储类型可由存储模式存储模式指指定缺定缺省类省类型型, 也也可由关键字可由关键字code、data、idata、xdata、pdata直接声明直接声明指定指定。例如例如: unsigned char data buffer; data buffer; /没有
26、指定数据类型没有指定数据类型, 默认为默认为int型型unsigned char code numtab16=0 xC0, 0 xF9, 0 xA4, 0 xB0, 0 x99, 0 x92, 0 x82, 0 xFB, 0 x80, 0 x90, 0 x88, 0 x83, 0 xC6, 0 xA1, 0 x86, 0 x8E ; /定义定义LED显示字模显示字模(参见参见137页页)unsigned char xdata arr1044;5.1.3 数据类型数据类型 3 3存储器类型存储器类型对变量定义格式:对变量定义格式:数据类型数据类型 存储器类型存储器类型 变量名表变量名表; 235
27、.1.3 数据类型数据类型 3.3.存储器类型存储器类型数据存储类型的指定数据存储类型的指定:变量变量或函数或函数参数参数存储类型可由存储类型可由存储模式存储模式 (Small, large, Compact) (Options for Target Target 1.选项选项)指定缺指定缺省存储类型省存储类型; u在在small模式下模式下, 函数参数和局部变量位于由函数参数和局部变量位于由data定定义的义的单片机片内数据单片机片内数据RAM(007FH)中;中;u在在compact模式下模式下, 函数参数和局部变量位于函数参数和局部变量位于pdata定义的定义的扩展数据扩展数据RAM中中
28、(访问用访问用MOVX Ri)。u在在large模式下模式下, 函数参数和局部变量位于函数参数和局部变量位于xdata定义定义的的扩展数据扩展数据RAM中中(访问用访问用MOVX DPTR)数据数据存储模式存储模式 (Small, large, Compact)24在在Xtal(MHz)右侧框输入右侧框输入6,其余按默认设置。其余按默认设置。4-3 汇编语言程序调试汇编语言程序调试Project窗口窗口,选中选中Target 1, 并单击右键并单击右键, 出现浮动菜单。出现浮动菜单。浮动菜单中选中浮动菜单中选中 Options for Target Target 1.选项。选项。n出现出现Op
29、tions for Target Target 1 对话框对话框界面。在该界面界面。在该界面中中,点击点击Target标签标签。在该标签界面中,按下面设置参数。在该标签界面中,按下面设置参数:在此设置使用晶振的频率 针对目标硬件设置工具选项针对目标硬件设置工具选项Memory Model右侧下拉右侧下拉选择选择: Small, Compact, large 的的存储模式。存储模式。254关于指针数据类型关于指针数据类型指针变量的值是一个指针变量的值是一个地地址址, 这这个地址不仅可以是变个地址不仅可以是变量的量的地地址址, 也也可以是其他数据结构的地址。可以是其他数据结构的地址。Keil C5
30、1编译器支持两种指针编译器支持两种指针类类型:型:一一般般指指针针(Generic Pointer)和和存储器存储器指指针针(Memory Specific Pointer, 指指定存储区指针定存储区指针)。一一般指针般指针的声明和使用均与标准的声明和使用均与标准C相相同同, 同时同时还还可可以以说说明指针的明指针的存储存储类类型型(见下页见下页)。char *s ; /* string ptr */int *numptr; /* int ptr */5.1.3 数据类型数据类型 4 4关于指针数据类型关于指针数据类型26一一般指针般指针的声明和使用均与标准的声明和使用均与标准C相相同同, 同
31、同时时还还可可以以说说明指针的明指针的存储类存储类型型。char *s ; /* string ptr */int *numptr; /* int ptr */可用可用存储类型标识符存储类型标识符指定一个指定一个通用指针的存储区通用指针的存储区如如: char * xdata strptr; /* generic ptr stored in xdata */int * data numptr; /* generic ptr stored in data */long * idata varptr; /* generic ptr stored in idata */这些例子指向可能保存在任何存储
32、区中的变量这些例子指向可能保存在任何存储区中的变量 但是但是 指针分别保存在指针分别保存在xdata、data和和idata中中。5.1.3 数据类型数据类型 4 4关于指针数据类型关于指针数据类型27一般指一般指针针用用3个字节存放个字节存放: 存储器类型存储器类型, 存储器地址高存储器地址高8位位偏移量偏移量和和低低8位偏移量位偏移量。 char data * str; /str指向指向data区中区中char型数据型数据 int xdata * pow; /pow指向指向外部外部RAM的的int型整数型整数这种指针存放时这种指针存放时, 只需只需1(或或2)个字节就够了个字节就够了, 因
33、只需存放偏移因只需存放偏移量。量。 存存储储器器指针指针( (指定存储区指针指定存储区指针) ), , 说明时即指定了说明时即指定了存储类型存储类型, , 例如例如: : 4.4.关于指针数据类型关于指针数据类型存储类存储类型型 Idata/data/bdata pdataxdataCode编码值编码值0 x000 xFE0 x010 xFF存放存放数据数据的存储器类型的存储器类型存储器类型是在存储器类型是在编译时编译时需要的需要的, 既已指出既已指出,所以所以指针只需存偏移量即可指针只需存偏移量即可, 参考参考:Keil Help: Cx51 Compiler Users GuideLang
34、uage Extensions Pointers285.1.3 数据类型数据类型 4.4.关于指针数据类型关于指针数据类型象象一般一般指指针针一样一样 可指定一个可指定一个存储器存储器指针指针的的保存存储区保存存储区, 即在指针声明前加存即在指针声明前加存储类型标识符储类型标识符, 例如例如:unsigned char xdata *pt; /pt本身本身依依存储模式存储模式存放存放unsigned char xdata * data pt; /pt被保存在被保存在内部内部RAM中中unsigned char xdata * xdata pt; /pt被保存在被保存在外部外部RAM中中上面的语
35、句都声明上面的语句都声明pt为指向保存在为指向保存在外部外部RAM中中unsigned char数据数据的指针的指针, 但但pt本身本身的的保存位置保存位置却不同。却不同。存储器存储器指针指针29运算符运算符是告诉编译程序执行特定算术或逻辑操作是告诉编译程序执行特定算术或逻辑操作的符号,的符号,表达式表达式则是由运算符及运算对象所组成的具则是由运算符及运算对象所组成的具有特定含义的一个式子。有特定含义的一个式子。在任意一个表达式的后面加一个分号在任意一个表达式的后面加一个分号“;”就构就构成了一个成了一个表达式语句表达式语句。C51程序程序就是由多个表达式语就是由多个表达式语句构成的语句集合。
36、句构成的语句集合。运算符可以分为运算符可以分为赋值运算符赋值运算符、算术运算符算术运算符、关系关系运算符运算符、逻辑运算符逻辑运算符、位运算符位运算符、复合赋值运算符复合赋值运算符、逗号运算符逗号运算符、条件运算符条件运算符、指、指针和地址运算符针和地址运算符、强制强制类型转换运算符类型转换运算符等。等。5.1.4 运算符和表达式运算符和表达式301赋值运算符赋值运算符符号符号“=”为赋值运算符为赋值运算符,它的作用是将一,它的作用是将一个数据的值或表达式的值赋给一个变量。利用个数据的值或表达式的值赋给一个变量。利用赋值运算符将一个变量与一个表达式连接起来赋值运算符将一个变量与一个表达式连接起
37、来的式子成为的式子成为赋值表达式赋值表达式,在赋值表达式的后面,在赋值表达式的后面加一个分号加一个分号“;”便构成了便构成了赋值语句赋值语句。5.1.4 运算符和表达式运算符和表达式 1 1赋值运算符赋值运算符312算术运算符算术运算符算术运算符用于各类数值运算。包括加算术运算符用于各类数值运算。包括加(+)、)、减或取负值(减或取负值(-)、乘()、乘(*)、除()、除(/)、取余(或称模)、取余(或称模运算,运算,%)、自增()、自增(+)、自减()、自减(-)共七种)共七种。在在除法运算除法运算中中,如果是两个整数相除,其结果为如果是两个整数相除,其结果为整数,舍去小数整数,舍去小数部分
38、部分。用算术运算符将运算对象连接起来的式子就是用算术运算符将运算对象连接起来的式子就是算算术表达式术表达式。5.1.4 运算符和表达式运算符和表达式 2 2算术运算符算术运算符32计算一个算术表达式的值时,计算一个算术表达式的值时,要按照运算符的优要按照运算符的优先级高低顺序进行先级高低顺序进行。算术运算符中,。算术运算符中,取负值(取负值(-)的优)的优先级最高,其次是乘法(先级最高,其次是乘法(*)、除法()、除法(/)和取余()和取余(%)运算符,加法(运算符,加法(+)和减法()和减法(-)运算符的优先级最低)运算符的优先级最低。需要时,可在算术表达式中必要的地方采用圆括号来需要时,可
39、在算术表达式中必要的地方采用圆括号来改变优先级,改变优先级,括号的优先级最高括号的优先级最高。在使用自增(在使用自增(+)运算符和自减()运算符和自减(-)运算符时,)运算符时,要注意运算符的位置。例如,要注意运算符的位置。例如,+i和和i+的意义完全不的意义完全不同同,前者为在使用,前者为在使用i之前先使之前先使i加加1,而后者则是在使用,而后者则是在使用i之后再使之后再使i加加1。在实际应用中,尽可能使用后者的方。在实际应用中,尽可能使用后者的方式,即式,即i+的形式。的形式。5.1.4 运算符和表达式运算符和表达式 2 2算术运算符算术运算符333关系运算符关系运算符关系运算符关系运算符
40、用于比较运算用于比较运算。包括。包括大于(大于()、小)、小于(于(=)、小于等于()、小于等于(=)、等等于于(= =)和)和不等于(不等于(!=)六种。六种。前四种关系运算符具有相同的优先级,后两种关前四种关系运算符具有相同的优先级,后两种关系运算符也具有相同的优先级;但前四种的优先级高系运算符也具有相同的优先级;但前四种的优先级高于后两种。用关系运算符将两个表达式连接起来即构于后两种。用关系运算符将两个表达式连接起来即构成成关系表达式关系表达式。5.1.4 运算符和表达式运算符和表达式 3关系运算符关系运算符344逻辑运算符逻辑运算符逻辑运算符包括逻辑运算符包括与(与(&)、或()、或(
41、|)、非()、非(!)3种,种,用于对包含关系运算符的表达式(称为条件)进用于对包含关系运算符的表达式(称为条件)进行合并或取非运算行合并或取非运算。关系运算符和逻辑运算符通常用来判别某个或某关系运算符和逻辑运算符通常用来判别某个或某些条件是否满足,条件满足时结果为些条件是否满足,条件满足时结果为1,条件不满足时,条件不满足时结果为结果为0。5.1.4 运算符和表达式运算符和表达式 4逻辑运算符逻辑运算符35与运算符(与运算符(&)表示)表示2个条件同时满足时(即个条件同时满足时(即2个条件都为真时),返回结果才为真。个条件都为真时),返回结果才为真。或运算符(或运算符(|)用于检查)用于检查
42、2个条件中是否有个条件中是否有1个为个为真的运算符,只要有真的运算符,只要有1个条件为真,运算结果就为真。个条件为真,运算结果就为真。逻辑非运算符(逻辑非运算符(!)表示对表达式的值取反。)表示对表达式的值取反。上述几种运算符的优先级依次为(由高到低):上述几种运算符的优先级依次为(由高到低):逻辑非逻辑非算术运算符算术运算符关系运算符关系运算符逻辑与逻辑与逻辑或。逻辑或。5.1.4 5.1.4 运算符和表达式运算符和表达式 4逻辑运算符逻辑运算符365位运算符位运算符语言提供了语言提供了6种位运算符:种位运算符:按位与(按位与(&)、按位或()、按位或(|)、按位异或()、按位异或()、)、
43、取反(取反()、左移()、左移()。位运算符的位运算符的优先级优先级从高到低依次为:从高到低依次为:按位取反按位取反()左移(左移()和右移()和右移()按位与(按位与(&)按位按位异或(异或()按位或(按位或(|)。5.1.4 运算符和表达式运算符和表达式 5位运算符位运算符 其功能是参与运算的两数各其功能是参与运算的两数各对应的二进位进行如下运算:对应的二进位进行如下运算:37(1)按位与运算)按位与运算按位与运算符按位与运算符“&”是双目运算符。其功能是参是双目运算符。其功能是参与运算的两数各对应的二进位相与。只有对应的与运算的两数各对应的二进位相与。只有对应的2个二个二进位均为进位均为
44、1时,结果位才为时,结果位才为1,否则为,否则为0。(2)按位或运算)按位或运算按位或运算符按位或运算符“|”是双目运算符。其功能是参与是双目运算符。其功能是参与运算的两数各对应的二进位相或。只要对应的运算的两数各对应的二进位相或。只要对应的2个二进个二进位有位有1个为个为1时,结果位就为时,结果位就为1。5.1.4 运算符和表达式运算符和表达式 5位运算符位运算符38(3)按位异或运算)按位异或运算按位异或运算符按位异或运算符“”是双目运算符。其功能是参是双目运算符。其功能是参与运算的两数各对应的二进位相异或。当与运算的两数各对应的二进位相异或。当2个对应的二个对应的二进位相异时,结果为进位
45、相异时,结果为1。(4)求反运算)求反运算求反运算符求反运算符“”为单目运算符,具有右结合性。为单目运算符,具有右结合性。其功能是对参与运算的数的各二进位按位求反。其功能是对参与运算的数的各二进位按位求反。5.1.4 5.1.4 运算符和表达式运算符和表达式 5位运算符位运算符39(5)左移运算)左移运算左移运算符左移运算符“”是双目运算符。其功能把是双目运算符。其功能把“”左边的运算数的各二进位全部左移若干位,由左边的运算数的各二进位全部左移若干位,由“”是双目运算符。其功能是把是双目运算符。其功能是把“”左左边的运算数的各二进位全部右移若干位,边的运算数的各二进位全部右移若干位,“”右边的
46、数右边的数指定移动的位数。指定移动的位数。对于有符号数,右移时,符号位将随同移动。当为正对于有符号数,右移时,符号位将随同移动。当为正数时,最高位补数时,最高位补0;为负数时,符号位为;为负数时,符号位为1,最高位补,最高位补1。5.1.4 运算符和表达式运算符和表达式 5位运算符位运算符406复合赋值运算符复合赋值运算符在赋值运算符在赋值运算符“=”之前加上其他二目运算符之前加上其他二目运算符可构成可构成复合赋值运算符。构成复合赋值表达式的复合赋值运算符。构成复合赋值表达式的一般形式一般形式为:为: 变变量量 双目运双目运算符算符 = 表表达式达式它等效它等效于:于: 变变量量=变量变量 运
47、算符运算符 表达式表达式复复合赋值运算符合赋值运算符有:有:+=, - =, *=,=, %=,=,&=,=,=,|=。5.1.4 运算符和表达式运算符和表达式 6复合赋值运算符复合赋值运算符417逗号运算符逗号运算符逗号运算符用于把若干表达式组合成一个表达式逗号运算符用于把若干表达式组合成一个表达式(称为逗号表达式)。程序运行时,对于逗号表达式的(称为逗号表达式)。程序运行时,对于逗号表达式的处理,是从左至右依次计算出各个表达式的值,而整个处理,是从左至右依次计算出各个表达式的值,而整个逗号表达式的值是最右边表达式的逗号表达式的值是最右边表达式的值。例如:值。例如:int a1,a2,b=2
48、,c=7,d=5; / 第1行a1=(+b,c-,d+3); / 第2行, a1的值为8a2=+b,c-,d+3; / 第3行, a2的值为45.1.4 运算符和表达式运算符和表达式 7逗号运算符逗号运算符428条件运算符条件运算符条件运算符条件运算符(?:)是一个三目运算符)是一个三目运算符,用于条件求用于条件求值值。它要求有三个运算对象,使用它可以将三个表达式。它要求有三个运算对象,使用它可以将三个表达式连接构成一个条件表达式。条件表达式的一般形式为:连接构成一个条件表达式。条件表达式的一般形式为:逻辑表达式逻辑表达式 ?表达式?表达式1:表达式:表达式2其功能是,首先计算逻辑表达式的值,
49、其功能是,首先计算逻辑表达式的值,当逻辑表达当逻辑表达式的值式的值为真(非为真(非0值)值)时,将时,将表达式表达式1的值的值作为整个条件作为整个条件表达式的值表达式的值;当逻辑表达式的值;当逻辑表达式的值为假(为假(0值)值)时,将时,将表表达式达式2的值的值作为整个条件表达式的值。作为整个条件表达式的值。5.1.4 运算符和表达式运算符和表达式 8条件运算符条件运算符439指针和地址运算符指针和地址运算符变量的指针就是该变量的地址变量的指针就是该变量的地址, 而存而存放变量地址的变放变量地址的变量称为指量称为指针变针变量量。为表示指针变量和它所指向的变量地。为表示指针变量和它所指向的变量地
50、址之间的关系址之间的关系, C语言语言有有运算符运算符: 取内容取内容(*)和和取取地址地址(&), 其运其运算的一般形式分别为:算的一般形式分别为:变量变量=*指针变量指针变量指针变量指针变量=&目标变量目标变量取取内容内容(*)运运算的含义算的含义是将指针变量所指向的目标变是将指针变量所指向的目标变量的值赋给等号(量的值赋给等号(=)左边的变)左边的变量量;取地址取地址(&)运运算的含算的含义是义是将目标变量的地址赋给等号(将目标变量的地址赋给等号(=)左边的指针变量)左边的指针变量。5.1.4 运算符和表达式运算符和表达式 9指针和地址运算符指针和地址运算符44unsigned char