Microsoft Word - 第3章.doc

Size: px
Start display at page:

Download "Microsoft Word - 第3章.doc"

Transcription

1 第 3 章 C51 程序设计 C 语言由于其功能强大 结构性强 可移植性好等优点, 深受广大编程人员的喜爱, 而单片机 C 语言既具有 C 语言的特点, 又兼有汇编语言对操作硬件的功能, 因此, 在现代单片机程序设计中, 单片机 C 语言得到了广泛应用 本章主要介绍 MCS-51 单片机 C 语言的基础知识及程序设计 3.1 C51 的标识符和关键字 标识符和关键字是一种编程语言最基本的组成部分,C51 语言同样支持自定义的标识符及系统保留的关键字, 在进行 C51 程序设计时, 需要了解标识符和关键字的使用规范 1. 字符集 单片机 C 源程序都是由键盘上的字符按相应语法规定而写成的, 这些字符分为三类 : (1)26 个英文字母 ( 包括大小写 ); (2)10 个阿拉伯数字 ; (3) 其他符号, 如 :+ * / % < > =! 等 2. 标识符 源程序中有各种程序对象, 如变量 函数 数组 数据类型等 为了正确使用这些程序对象, 应先命名标识 这种具有名字效应的字符序列, 称为标识符 对于标识符,C 语言规定 : (1) 只能由英文字母 (A-Z,a-z) 数字(0-9) 下划线 _ 三种符号组成 ; (2) 大写字母与其小写字母视为不同, 即代表不同的对象, 如 A12 与 a12 代表不同的对象 ; (3) 数字字符不能作为标识符的首字符, 如 1ab 就是错误的 3. 关键字 C 语言把一些具有特定含义的标识符划归系统使用, 作为专用的定义符来使用 这种专用定义符就是关键字, 这些特定的关键字不允许程序设计人员作为自定义的标识符使用, C 语言的关键字一般是由小写字母构成的字符序列 C 语言的关键字如表 3-1 所示 单片机 C51 程序语言不仅继承了 ANSIC 标准定义的 32 个关键字, 还根据 C51 语言及单片机硬件的特点扩展了相关的关键字 在 C51 语言程序设计中, 用户自定义的标识符不能和这些关键字相冲突, 否则无法正确通过编译 下面具体介绍一下这几个关键字 :

2 精通 MCS-51 单片机 C 语言编程 表 3-1 C 语言的关键字 auto break case char const default do double else enum continue extern float for goto if int long register return short signed sizeof static struct switch typedef union unionunsigned void volatile while (1) 使用相关的关键字可以将数据存放到指定的存储空间, 这些关键字如表 3-2 所示 : 表 3-2 数据存储空间定义 关键字 作 用 data 直接使用单片机低 128 字节的常用内存区, 速度最快 bdata 直接使用常用内存区的 20-2FH 位寻址区共 128 位 idata 间接使用片内 RAM256 字节, 也就是通过间接寻址的方法使用内存储区 pdata 采用分页寻址的方法使用片外 256 字节数据存储区 xdata 直接使用片外 64KB 数据存储区 code 直接访问代码存储区 (64KB 的空间 ) (2)bit 位标量 : 利用它可以定义一个位标量, 但不能定义位指针, 也不能定义位数组 它的值是一个二进制位, 不是 0 就是 1 (3)sbit 可寻址位 : 利用它可以定义内部 RAM 中的可寻址位或特殊功能寄存器中的可寻址位 (4)sfr 特殊功能寄存器 :8 位特殊功能寄器 (5)sfr16 特殊功能寄存器 :sfr16 和 sfr 一样用于操作特殊功能寄存器, 所不同的是它用操作占两个字节 (16 位 ) 的寄存器, 如定时器 T0 和 T1 (6)interrupt: 中断函数说明, 定义一个中断函数 (7)reentrant: 再入函数说明, 定义一个再入函数 (8)using: 寄存器组定义, 定义芯片的工作寄存器 3.2 变量和常量 数据类型有常量和变量之分, 常量就是在程序的运行过程中不能改变其值的量, 而变量是在程序的运行过程中能够改变其值的量 C51 编译器支持 C 语言中所有的变量类型, 而对常量的支持类型只有整型 浮点型 字符型 字符串型和位标量 常量 程序中固定的数据表 字库等都是常量 常量区分为不同的类型, 如整型常量 浮点数常量 字符型常量 枚举常量等 整型常量能表示为十进制, 如 123,0, 89 等, 也可以表示成十六进制, 如 0x34 0x3B 等 ; 长整型就在数字后面加字母 L, 如 104L 034L 等 100

3 第 3 章 C51 程序设计 字符型常量在使用之前必须先定义, 其一般形式为 : #define 标识符常量 它的功能是把该标识符定义为其后面的常量值 在定义后的程序中, 所有出现该标识符的地方均代之以该常量值 (1) 习惯上字符型常量的标识符用大写字母, 变量标识符用小写字母, 以示区别 (2) 字符型常量与变量不同, 字符型常量的值在其作用域内不能改变, 也不能再被赋值 例 3-1 字符型常量的使用 #define WEIGHT 20 // 在以后的程序中 WEIGHT 为常量, 其值为 20 main() int num,total; num=10; total=num* WEIGHT; printf("total=%d",total); 程序运行的结果 : total=200 (1) 通过 #define 定义的字符型常量在编译后的目标代码中并不存在 因为在对程序进行编译之前, 编译器首先对标识符进行字符替换, 也就是说, 编译器实际编译的是标识符所代表的常量 (2)printf( 格式, 变量 ) 函数是打印函数, 其功能是将 变量 按照 格式 说明进行输出 %d 代表将 total 按整型变量的格式输出 变量 其值可以改变的量称为变量 一个变量应该有一个名字, 在内存中占据一定的存储单元, 在存储单元中存储着该变量的数值, 因此变量名和变量值是两个不同的概念 要在程序中使用变量必须先用标识符作为变量名, 并指出所用的数据类型和存储器类型, 这样编译系统才能为变量分配相应的存储空间, 一般放在函数体的开头部分 定义一个变量的格式如下 存储种类数据类型存储器类型变量名 ; 在定义格式中除了数据类型和变量名是必须的以外, 其他项都是可选项, 定义变量时, 允许同时定义多个相同类型的变量, 各变量之间用逗号间隔, 最后一个变量名以 ; 结尾 1. 存储种类及作用域 变量在程序被编译时由编译器根据存储类型进行定位 存储种类有 4 种 : 自动 (auto) 类型 外部 (extern) 类型 静态 (static) 类型和寄存器 (register) 类型 变量作用域是程序中变量起作用的范围, 由于 C51 中可以包含多个函数和程序文件, 101

4 102 精通 MCS-51 单片机 C 语言编程 因此使用变量时, 除要首先定义该变量外, 还要注意变量的有效作用范围, 即该变量的作用域 变量作用域即变量的作用范围, 可以是作用于一个函数或程序文件, 甚至整个工程里的所有文件都可用 下面针对 4 种存储种类分别介绍它们的作用域范围 (1) 自动变量自动变量一般是在函数内部或程序块中使用, 是变量的缺省类型, 其标识为关键字 auto 定义格式为: auto 类型说明符变量标识符 自动变量的作用域范围是函数或者程序块的内部 在编译 C51 程序时, 自动变量根据变量类型动态分配存储空间 在程序执行到该函数时, 根据变量类型为其自动分配存储空间, 当该函数执行完毕后, 立即取消该变量的存储空间, 即该自动变量失效 这样在该函数内部定义的变量, 就不能在该函数外引用 使用自动变量的程序示例如下 例 3-2 自动变量的作用范围实例 #include <stdio.h> void main(void) auto int a,b; // 定义自动变量 a = 1; b = 2; if(1) auto int a =11; auto int b =22; printf("a,b are firstly printed as : %d, %d\n", a,b); printf("a,b are secondly printed as: %d, %d\n", a,b); 程序的运行结果为 : a,b are firstly printed as :11, 22 a,b are secondly printed as: 1, 2 分析 : 在该程序中, 主函数声明了 auto 型整型变量 a 和 b, 然后在 if 结构中再次定义并初始化 auto 型的同名的变量 a 和 b, 根据前面的介绍, 虽然变量名相同, 其作用域仅限于函数内部和块结构内部, 不会影响外部的变量, 即使块结构内定义的变量与块结构外定义的变量具有相同的变量名, 它们之间也不会发生冲突, 在编写程序的时候要特别注意 在 C51 中, 函数或程序块内部定义的变量, 一般都默认为自动型变量 因此, 在不声 明自动型变量时, 关键字 auto 一般都可以省略 (2) 全局变量如果一个变量定义在所有函数的外部, 即整个程序文件的最前面, 那么它的作用域是整个程序文件, 所以该变量称为全局变量 一个复杂的程序工程可能包含很多个独立的源码文件, 各文件之间一定存在数据共享或参数传递 比如 A 文件使用了在 B 文件中定义的变量, 这时该变量一般用 extern 进行引用声明, 那么该变量是整个工程中的全局变量, 也可以称为 A 文件中引用的外部变量, 其定义格式为 : extern 类型说明符变量标识符

5 第 3 章 C51 程序设计 全局变量的作用域是整个程序文件, 在编译 C51 程序时, 全局变量根据变量类型被静态地分配适当的存储空间 在整个程序运行过程中, 该变量一旦分配空间, 便不会消失 这样全局变量对整个程序文件都有效, 可以作为不同函数间的参数进行传递和共享 例 3-3 全局变量的作用范围实例 例如一个软件工程包含两个程序文件, 分别为 Ex_main.c 和 Ex_increase.c Ex_main.c 文件的部分内容如下 : int a,b,c; int increasen(); void main(void) ; /* 串口初始化 */ a = 1; b = 2; c = 3; increasen(); Ex_increase.c 文件的部分内容如下 : extern a,b,c; int increasen() a++; b++; c++; printf("a,b,c in function increasen are : %d, %d, %d\n", a,b,c); 程序的运行结果为 : a,b,c in function increasen are : 2, 3, 4 分析 :Ex_main.c 文件在开始位置定义了整型的全局变量 a b c, 并在主函数中被初始化 Ex_increase.c 文件在开始位置声明了外部变量 a b c, 然后定义 increasen () 函数并将三个变量的数值加 1 从程序的运行结果看出,increaseN () 函数中的操作对象 a b c 就是在 Ex_main.c 文件中定义的变量 a b c, 通过 extern 对三个外部变量的引用说明,increaseN () 函数实现了对 Ex_main.c 文件中的变量的加 1 操作 (3) 静态变量静态变量即在编译 C51 程序时, 根据数据类型静态分配合适的存储空间, 并在程序运行过程中始终占有该存储空间的变量 静态变量以关键字 static 定义, 其格式为 : static 类型说明符变量标识符 根据变量声明位置的不同,C51 语言中的静态变量可以分为以下两种 1 内部静态变量, 即在函数内部定义, 其作用域只是定义该变量的函数内部, 与自动变量类似 2 外部静态变量, 即在函数外部定义, 其始终占有内存空间, 与全局变量类似 除了静态变量外,C51 语言还允许将自定义函数定义为静态型, 同样用 static 关键字来定义这样, 只有同一程序文件中的其他函数才能调用这个静态型函数, 而工程项目中的其他程序文件则不能调用访问 使用静态型函数既有利于程序的模块化设计, 又可以防止和其他文件中的函数发生重名的情况 103

6 例 3-4 静态变量的作用范围实例 精通 MCS-51 单片机 C 语言编程 static int fun_static(int n) static int f=1; f=f*n; return(f); static int fun(int n) int f=1; f=f*n; return(f); void main() int i; ; /* 串口初始化 */ printf("i and its corresponding result of static_func are\n"); for(i=1;i<=5;i++) printf( "%d : %d\n",i,fun_static(i)); printf("i and its corresponding result of func are\n"); for(i=1;i<=5;i++) printf( "%d : %d\n",i,fun(i)); 程序的运行结果如下, 注意静态变量对计算结果的影响 : i and its corresponding result of fun_static are 1:1 2:2 3:6 4:24 5:120 i and its corresponding result of fun are 1:1 2:2 3:3 4:4 5:5 (4) 寄存器变量寄存器变量被存储在 CPU 的寄存器中 寄存器变量以关键字 register 声明, 声明的格式为 : register 类型说明符变量标识符 由于寄存器变量被存储在 CPU 的寄存器中, 因此其读写速度较高 寄存器变量常用于某一变量名频繁使用的情况, 这样做可以提高系统的运算速度 (1) 由于单片机内部寄存器数量有限, 不能定义多个寄存器变量 在实际程序设计中, 应将最重要的变量设置为寄存器变量, 以提高系统的执行速度 (2) 在 C51 中, 只允许同时定义两个寄存器变量, 如果多于两个, 程序在编译时会自动将两个以外的寄存器变量作为非寄存器变量来处理 104

7 第 3 章 C51 程序设计 2. 数据类型 C51 的数据类型包括基本数据类型和聚合型数据 ( 如数组 指针 联合和结构 枚举等, 这部分内容参见本书 3.4 节 ) 在本节主要介绍基本数据类型, 包括整型 (int) 浮点型 (float) 字符型 (char) 无值型 (void) 在基本数据类型中, 除 void 类型外, 其前面均可以有各种修饰符, 常用的修饰符有 signed( 有符号 ) unsigned( 无符号 ) long( 长型符 ) short( 短型符 ) 在 C51 语言中, 所有数据类型的字长和取值范围如表 3-3 所示 表 3-3 C51 语言的数据类型 类 型 字 长 取值范围 char( 字符型 ) 8 ASC 字符或 0~255 unsigned char( 无符号字符型 ) 8 0~255 signed char( 有符号字符型 ) 8 128~127 int( 整型 ) ~32767 unsigned int( 无符号整型 ) 16 0~65535 signed int( 有符号整型 ) 16 同 int short( 短整型 ) 8 128~127 unsigned short int( 无符号短整型 ) 8 0~255 singed short int( 有符号短整型 ) 8 同 short int long int( 长整型 ) ~ signed long int( 有符号整型 ) ~ unsigned long int( 无符号长整型 ) 32 0~ float( 单浮点型 ) 32 约精确到 6 位数 void( 无值型 ) 0 无值 (1)C51 以整型的默认定义为有符号数, 因此,signed 修饰符可以省略 (2) 为了使用方便,C51 允许使用整型简写形式, 如 short int 简写为 short 等 各种数据类型的定义举例如下 : char c_var; int a_var,b_var; long c_var float f_var; void *p1; // 定义 c_var 为字符型变量 // 定义 a,b 为短整型变量 // 定义 c 为长整型变量 // 定义 f_var 为浮点型变量 // 定义 p1 为无值型指针 3. 存储器类型说明了一个变量的数据类型后, 还可以选择说明该变量的存储器类型 存储器类型指定的是该变量在单片机硬件系统中所使用的存储区域, 并在编译时进行准确定位 51 单片机的 C51 编译器支持的存储器类型如表 3-2 的内容, 包括 data bdata idata pdata xdata code 类型 如果不对变量的存储器类型进行说明, 系统会按编译模式 Small Compact 或 Large 所规定的模式将变量按照指定的存储类型存放到相应的区域 在 C51 编译器的 3 种存储器模式下, 变量的存储方式如下 (1)Small: 相关参数 堆栈和局部变量都存储在 128byte 的可以直接寻址的片内存储 105

8 精通 MCS-51 单片机 C 语言编程 器, 使用 DATA 存储类型 因为位于片内存储器, 所以该类型变量的优点是访问速度快, 缺点是空间有限, 只适用于小程序 (2)Compact: 参数和局部变量存放在 256byte 的分页片外存储区, 使用寄存器间接寻址, 存储类型为 PDATA, 堆栈空间在片内存储区, 优点是空间较 Small 慢, 较 Large 要快, 是一种中间状态 (3)Large: 参数和局部变量可放在多达 64KB 的外部 RAM 区, 使用 DPTR 数据指针间接寻址, 存储类型为 XDATA, 优点是空间大, 可存变量多, 缺点是速度较慢 (1) 变量的存储类型与存储器模式是完全无关的 (2) 存储模式只是对未特别声明的变量进行存储范围的自动分配, 也就是说, 无论在什么存储模式下, 都能通过具体的声明改变变量的存储范围 (3) 把最常用的命令如循环计数器和队列索引放在内部数据区能显著提高系统性能 例 3-5 定义存储在 data 数据区的动态 unsigned char 变量 Unsigned char data sec=0,minu=0,hour=0; // 定义秒 分 时, 并且赋初值为 0 4. 特殊功能寄存器 MCS-51 系列单片机片内有 21 个特殊功能寄存器 (SFR), 对 SFR 只能用直接寻址方式 (1) 使用 sfr sfr16 定义寄存器 C51 编译器可以利用扩充关键字 sfr 和 sfr16 直接访问 51 系列单片机内部的特殊功能寄存器, 定义寄存器的格式如下 sfr 特殊功能寄存器名 = 特殊功能寄存器地址常数据 ; sfr16 特殊功能寄存器名 = 特殊功能寄存器地址常数据 ; (1) 等号后面必须是常数, 不允许有带运算符的表达式, 而且该常数必须在特殊功能寄存器的地址范围之内 (80H~FFH) (2) 如果被定义的特殊功能寄存器是 16 位寄存器, 用 sfr16 定义 16 位特殊功能寄存器时, 等号后面是它的低位地址, 高位地址一定要位于物理低位地址之上, 注意不能用于定时器 0 和 1 的定义 例 3-6 P1 口的地址是 90H, 定义单片机的 P1 口 sfr P1=0x90; // 定义 P1 口地址为 90H (2) 使用 sbit 定义位变量 C51 编译器可以利用扩充关键字 sbit 对寄存器或变量中的位进行定义, 常用的定义方式有如下 3 种 1 方式 1 sbit 位变量名 = 位地址 ; 这种方法将位的绝对地址赋给位变量, 位地址必须位于 80H~0FFH 例如: sbit EA=0x91; // 指定 0x91 位是 EA, 即中断允许位 106

9 第 3 章 C51 程序设计 2 方式 2 sbit 位变量名 = 特殊功能寄存器名 ^ 位位置 ; 当可寻址位位于特殊功能寄存器中时可采用这种方法, 位位置 是一个 0~7 的常数, 先定义一个特殊功能寄存器名, 再指定位变量名所在的位置, 例如 : sfr P1=0x90; sbit P1_1=P1^1; // 指定 P1 口地址为 0x90 // 指定 P1_1 为 P1 口的第 2 个引脚 3 方式 3 sbit 位变量名 = 字节地址 ^ 位位置 ; 这种方法以一个常数 ( 字节地址 ) 作为基址, 该常数必须位于 80H~0FFH, 位位置 是一个 0~7 的常数, 例如 : sbit P1_1=0x90^1; //* 指定 P1_1 为起始地址为 0x90 的寄存器的第 2 位, 即 P1_1 的第 2 个引脚 3.3 C51 的运算符与表达式 运算符是表示某种特定运算的符号,C51 语言的运算符按其在表达式中所起的作用, 可分为算术运算符 赋值运算符 增量与减量运算符 关系运算符, 还有些用于辅助完成复杂功能的特殊运算符, 如, 运算符? 运算符 地址操作运算符 联合操作运算符 sizeof 运算符 类型转换运算符等 当运算符的运算对象只有一个时, 称为单目运算符, 当运算对象为两个时, 则称为双目运算符, 当运算对象为三个时, 则称为三目运算符 在 C51 语言中, 需要进行运算的各个量 ( 常量或变量 ) 通过运算符连接起来便构成一个具有特定含义的表达式, 由运算符或表达式可以形成构成程序的各种语句 下面分类介绍各种运算符, 并结合实例介绍相应的表达式 算术运算符与表达式 算术运算符是用来进行算术运算的操作符,C51 语言中算术运算符有如下几类 1. 普通算术运算符 (1)+: 加法或者取正运算符 (2) : 减法或者取负运算符 (3)*: 乘法运算符 (4)/: 除法运算符 (5)%: 取余运算符 算术运算符除了取正和取负运算符为单目运算符外, 其余均为双目运算符, 即要求有两个对象参加算数运算, 注意运算的优先级问题, 这部分内容参考本书的 小节 107

10 精通 MCS-51 单片机 C 语言编程 用算术运算符将运算对象连接起来组成的式子就是算术表达式, 其一般形式为 : 表达式 1 算术运算符表达式 2 注意数据类型定义对算数运算结果的影响, 例如, 定义 a,b,c,d,e,f 为整型数据, g,h 为浮点型数据, 令 a=1,b=2,c = 3,g=3.0; 则 d = a+b-(-c)*5; // 算术表达式 a+b-(-c)*5 的值赋给 d,d 的值为 18 e = c/b; //e 的值为 1 f = c%b; //f 的值为 1 h = g/b; //h 的值为 1.5 (1) 对于除法运算, 如果是两个整数相除, 其结果仍为整数, 舍去小数部分 ; 如果是两个浮点数相除, 其结果仍是浮点数, 如上例中的 e 和 h 的区别 (2) 取余运算符要求两个运算对象均为整型数据, 得到的结果为两个参与运算的对象相除的余数 2. 自增和自减运算 自增和自减运算运算符是 C 语言中特有的一种运算符, 其作用是使运算对象自动加 1 或减 1, 但只允许用于变量的运算中, 不能用于常数或表达式 (1)++: 自增运算符 (2)--: 自减运算符 注意增量运算符放在变量之前或之后, 其含义不同, 例如, 定义 a,b,c, 均为整型数据, 令 a= 7; 则 b = a++; //a 和 b 的结果为 8 和 7 c = ++a; //a 和 c 的结果为 9 和 9 a++( 或 a--) 是先使用 a 的值, 即先把 a 的值赋给变量 b, 再执行 a+1( 或 a 1), 即 执行 a=a+1( 或 a=a 1);++a( 或 --a) 是先执行 a+1( 或 a 1), 即先执行 a=a+1( 或 a=a 1), 再使用 a 的值, 把 a 的值赋给 c 逻辑运算符与表达式 逻辑运算符是进行逻辑运算的操作符 C51 语言的逻辑运算符包括下面几种 : (1)!: 逻辑非运算 (2) : 逻辑或运算 (3)&&: 逻辑与运算其中 : 运算符 与 && 为双目运算符, 由它们组成的逻辑表达式的形式为 : 表达式 1 算术运算符表达式 2 而! 为单目运算符, 其组成的逻辑表达式为 : 108

11 第 3 章 C51 程序设计 算术运算符表达式 逻辑运算符的真值表如表 3-4 所示 表 3-4 逻辑运算真值表逻辑运算符表达式 1 的值表达式 2 的值逻辑运算结果 &&! 假假假 假真假 真 假 假 真 真 真 假假假 假真真 真 假 真 真 真 真 / 假真 / 真假 执行运算时, 左右两侧的操作数均视为逻辑量, 在 C51 语言中规定, 在判断一个逻辑量是否为真时, 非零的量都被视为是真, 为零的量都被视为假 例如 :a=-1,b=0,c=2; 则 d = a&&b; //d 的结果为 0 e = b c; //e 的结果为 1 f =!a; //f 的结果为 0, 由于 a 是个非零值, 逻辑运算认为它为 真 值, 其非运 算为 假, 即值为 关系运算符与表达式 关系运算符主要用于比较操作数的大小关系,C51 提供的关系运算符的用法和一般的 C 语言相类似, 常用的关系运算符如下所示 (1)>: 大于运算符 (2)>=: 大于等于运算符 (3)<: 小于运算符 (4)<=: 小于等于运算符 (5)==: 等于运算符 (6)!=: 不等于运算符 关系运算符都为双目运算符, 由其构成的关系表达式的形式为 : 表达式 1 关系运算符表达式 2 关系运算符的计算结果只有两种 : 真 (true) 或假 (false) 如果表达式 1 与表达式 2 的关系符合给定的关系运算符代表的关系, 则关系表达式的结果为 真, 反之为 假, 例如 : 令 a=-1;b=0;c=2; 则 109

12 精通 MCS-51 单片机 C 语言编程 a>b; // 判断 a 是否大于 b, 其结果为 0!a==!c; // 判断非 a 和非 c 是否相等, 因为相等所以结果为 1 a>b>c //a>b 为假, 则为 0,0 小于 2(c 的值 ), 所以结果为 位运算符与表达式 位运算符是对字节或字中的二进制位进行逐位逻辑处理或移位的运算符 位运算的操作对象为整型和字符型数据的字节或字, 不能用于 float double void 等类型,C51 语言中的位运算符如下 1. 位逻辑运算符 (1)&: 按位与运算符 (2) : 按位或运算符 (3)^: 按位异或运算符 (4)~: 按位取反运算符 位逻辑运算符除了按位取反运算符是单目运算符外, 其他的运算符都是双目运算符 位运算的一般表达式为 : 变量 1 位运算符变量 2 其中的位逻辑运算与表 3-4 的逻辑运算真值表相同, 比如两个变量有一个为假, 则相 与 的结果为假 例如, 若 a=30h= b,b=0fh= b, 则表达式 c=a b= b 位运算会是按位对变量进行运算, 但并不改变参与运算的变量的值 2. 移位运算符 (1)>>: 位右移运算符 (2)<<: 位左移运算符 其一般表达式为 : 变量 << 左移位数变量 >> 右移位数 左移运算符用来将一个二进制数的各个位左移指定的位数, 移到左端的高位被舍弃, 右边的低位由 0 补足 例如 : a=30h= b, 则 a<<1 的值为 B=60H 右移运算符用来将一个二进制数的各个位右移指定的位数, 移到右边的低位被舍弃, 对于无符号数或有符号数中的正数, 左边高位由 0 补足, 对于有符号数中的负数, 左边的高位由 1 补足 例如 : a=30h= b, 则 a>>1 的值为 B=18H 110

13 第 3 章 C51 程序设计 左移 1 位相当于原数乘以 2, 左移 n 位相当于原数乘以 2n, 同理右移 1 位相当于原数 除以 2, 右移 n 位相当于原数除以 2n 3.3.5, 运算符与表达式, 运算符是把几个表达式串在一起, 并用括号括起来, 按照顺序从左向右计算的运算符, 运算符左侧表达式的值不作为返回值, 只有最右侧表达式的值作为整个表达式的返回值 逗号表达式的形式为 : 表达式 1, 表达式 2,, 表达式 n 例如 : a = -1; b = 2; z = (a++, a=a+3, a+b); // 首先执行 a++, 其结果为 0, 然后执行 a=a+3, 结果 a=3, 最后执行 a+b, 其结果为 5, 并将结果赋给变量 z 3.3.6? 运算符? 运算符 ( 条件运算符 ) 是三目运算符, 它要求有三个运算对象, 其作用是根据逻辑表达式的值选择使用表达式的值 条件表达式的一般形式为 : 逻辑表达式 1? 表达式 2: 表达式 3 执行条件表达式时, 先计算表达式 1 的值, 如果表达式 1 的值为真, 则计算表达式 2 的值, 并将其结果作为整个表达式的结果 ; 如果表达式 1 的值为假, 则计算表达式 3 的值, 并将结果作为整个表达式的结果 例如 :a=-1;b=2; 则 z = a>b?a:b; // 先判断 a 是否大于 b, 其结果为假, 执行表达式 3, 即将 b 的结果赋给 z sizeof 运算符 sizeof 运算符返回变量所占的字节或类型长度字节 它是单目操作符 当 sizeof 运算符计算字符串的长度时, 其返回的长度包括字符串最后的空字符 例如 : unsigned char s="hello!"; a =sizeof(s); //a 的结果为 指针运算符 指针运算符用来对变量的地址进行操作 C51 语言中, 指针运算符主要有两种 : * 111

14 精通 MCS-51 单片机 C 语言编程 和 & 其中 * 运算符是单目运算符, 其返回位于某个地址内存储的变量值 ; & 运算符也是一个单目运算符, 也叫取地址运算符, 其返回操作数的地址 它们的一般形式分别为 : 变量 =* 指针变量 ; 指针变量 =& 目标变量 ; 例如 : a=2; b=3; c=4; p=&a; *p=5; 程序的运行结果为 : a=5,b=3,c=4 当程序执行赋值操作 p=&a 后, 指针实实在在地指向了变量 a, 这时引用指针 *p 就表 示变量 a, 所以在执行 *p=5 后, 变量 a 的值被赋值为 联合操作运算符 联合操作运算符主要用来简化一些特殊的赋值语句, 这类赋值语句的一般形式如下 < 变量 1>=< 变量 1>< 操作符 >< 表达式 > 利用联合操作运算符可以简化为如下形式 < 变量 1>< 操作符 >=< 表达式 > 联合操作运算符适合于所有的双目操作符,+= = *= /= %= >>= <<= &= ^= = 联合操作运算符实际是对两侧的操作数先进行运算符指定的运算, 再把结果赋值 给左侧的变量 例如 :a=112; b=6; a+=b; // 相当于 a=a+b, 其结果为 a=118 a&=b; // 相当于 a=a&b, 其结果为 a=0 a =b // 相当于 a=a b, 其结果为 a= 类型转换运算符 类型转换运算符用于强制使某一表达式的结果变为特定数据类型 类型转换运算符的一般形式如下 ( 类型 ) 表达式其中,( 类型 ) 中的类型必须是 C51 中的一种数据类型 例如 : int a,b,num,f2; char t='0',th; double f1,f3; a=7; b=111; num=t/((float)a/b); f1=(double)(b/a); f2=b/a; f3=(double)b/a; // 定义各种变量类型 112

15 第 3 章 C51 程序设计 程序的运行结果为 : num =761, f1 = , f2=15, f3= 在上例中 :1 执行 num=t/((float)a/b),a 被强制转换为 float 型, 然后与 b 进行除法运算, 除法运算的结果为 float 型, 即 7.0/111= 按照低级别向高级别转换的原则,t 在参与运算时也被由字符型转换为 float 型, 即 float( 0 )=48.0, 所以等式右边的运算结果应为 但是, 因为 num 是 int 型变量, 在执行等式赋值时, 等式右边的结果被转换为 int 型并赋予 num, 所以最终结果为 执行 f1=(double)(b/a), 因为 a b 都是 int 型, 所以二者相除的结果只保留到个位, 即结果为 15, 但经过强制类型转换 (double) 后, 数值 15 被转换为 double 型, 即 执行 f2=b/a, 因为 a b 都是 int 型, 所以二者相除的结果只保留到个位, 即结果为 15 4 执行 f3=(double)b/a,b 首先被转换为 double 型, 然后与 a 相除, 其结果为 double 型, 又因 f3 也为 double 型, 所以等式右边结果的小数点后的数位被保留, 即为 运算符优先级和结合性 在 C51 语言中, 当一个表达式中有多个运算符参与运算时, 要按照运算符的优先级别进行运算, 先执行优先级高的, 即下表中从优先级 1 执行到优先级 15, 在同一优先级中, 要考虑它的结合性, 例如 : 结合方向为从左到右, 即表示从左向右进行运算, 具体的优先级和结合方向如表 3-5 所示 表 3-5 运算符优先级和结合方向 优先级 运算符 名称或含义 使用形式 结合方向 说明 [] 数组下标 数组名 [ 常量表达式 ] 1 () 圆括号 ( 表达式 )/ 函数名 ( 形参表 ). 成员选择 ( 对象 ) 对象. 成员名 左到右 > 成员选择 ( 指针 ) 对象指针 > 成员名 负号运算符 表达式 单目运算符 ( 类型 ) 强制类型转换 ( 数据类型 ) 表达式 ++ 自增运算符 ++ 变量名 / 变量名 ++ 单目运算符 自减运算符 变量名 / 变量名 单目运算符 * 取值运算符 * 指针变量 右到左 单目运算符 & 取地址运算符 & 变量名 单目运算符! 逻辑非运算符! 表达式 单目运算符 ~ 按位取反运算符 ~ 表达式 单目运算符 sizeof 长度运算符 sizeof( 表达式 ) / 除 表达式 / 表达式 双目运算符 * 乘 表达式 * 表达式 左到右 双目运算符 % 余数 ( 取模 ) 整型表达式 % 整型表达式 双目运算符 + 加表达式 + 表达式双目运算符左到右 减表达式 表达式双目运算符 << 左移变量 << 表达式双目运算符左到右 >> 右移变量 >> 表达式双目运算符 113

16 精通 MCS-51 单片机 C 语言编程 续表 优先级 运算符 名称或含义 使用形式 结合方向 说明 > 大于 表达式 > 表达式 双目运算符 6 >= 大于等于表达式 >= 表达式双目运算符左到右 < 小于表达式 < 表达式双目运算符 <= 小于等于 表达式 <= 表达式 双目运算符 7 == 等于表达式 == 表达式双目运算符左到右!= 不等于表达式!= 表达式双目运算符 8 & 按位与 表达式 & 表达式 左到右 双目运算符 9 ^ 按位异或 表达式 ^ 表达式 左到右 双目运算符 10 按位或 表达式 表达式 左到右 双目运算符 11 && 逻辑与 表达式 && 表达式 左到右 双目运算符 12 逻辑或 表达式 表达式 左到右 双目运算符 13?: 条件运算符 表达式 1?: 表达式 2: 表达式 3 右到左 三目运算符 = 赋值运算符 变量 = 表达式 /= 除后赋值 变量 /= 表达式 *= 乘后赋值 变量 *= 表达式 %= 取模后赋值 变量 %= 表达式 += 加后赋值 变量 += 表达式 14 -= 减后赋值 变量 = 表达式 右到左 <<= 左移后赋值 变量 <<= 表达式 >>= 右移后赋值 变量 >>= 表达式 &= 按位与后赋值 变量 &= 表达式 ^= 按位异或后赋值 变量 ^= 表达式 = 按位或后赋值 变量 = 表达式 15, 逗号运算符 表达式, 表达式, 左到右 从左向右顺序运算 3.4 C51 构造数据类型 C51 提供了扩展的构造数据类型, 又称为复合变量, 包括数组 结构体 共用体和枚举, 这些变量的特点是它们按照一定的规则构成, 灵活运用它们对于程序开发来说是至关重要的 本节详细介绍各自的特点和彼此的不同点 数组 数组是一组由若干相同类型变量组成的有序集合, 并拥有共同的名字, 数组的每个元素都有唯一的下标, 通过数组名和下标可以访问数组的元素 通常情况下, 数组被存放在内存中一块连续的存储空间, 最低地址对应于数组的第一个元素, 最高地址对应于最后一个元素, 且每一个元素占有的存储单元是相同的 数组有一维 二维 三维和多维数组之分, 常用的是一维 二维和字符数组 一维数组 具有一个下标变量的数组称为一维数组

17 第 3 章 C51 程序设计 (1) 一维数组的一般形式 类型数组名 [ 长度 ] 类型是指每一个数组元素的数据类型, 包括整型 浮点型 字符型 指针型及结构和联合 数组名的命名规则与变量的命名规则相同, 长度是用于指定数组中的元素个数, 且只能为正整数 例如 : int a[10] // 定义一个含 10 个元素的整型数组 Unsigned int a[10] // 定义一个含 10 个元素的无符号整型数组 Char a[10] // 定义一个含 10 个元素的字符型数组 Struct a[10] // 定义一个含 10 个元素的结构型数组 同一个数组, 所有数据的类型是相同的, 并且数组都是以 0 作为第一个元素的下标, 上例中 int a[10] 的整型数组, 其 10 个元素应从 a[0]~a[9], 且每个元素为一个整型变量 (2) 数组的赋值和初始化数组在定义之后可以被赋值, 也可以单独为某个或整个数组在定义的同时被初始化 例如 : a[6]=9 // 把 9 赋给 a 的第 6 个元素 Int a[5]=5,3,2,1,0 // 定义数组 a 为含 10 个元素的整型数组, 并赋以初值 Int i[]=1,2,3,4,5 // 定义数组 i 为整型数组并赋初值, 但数组的个数由赋值的个数来确定, 在本例中数组大小为 5 C51 对数组不作边界检查, 如定义了两个数组 :int a[5],int b[6]; 当输入 1,2,3,4, 5,8 时, 前 5 个数赋给数组 a, 而第 6 个数字 8 则被赋给数组 b 2. 二维数组 (1) 二维数组的一般形式 C51 允许使用多维数组, 最简单的多维数组是二维数组 实际上, 二维数组是以一维数组为元素构成的数组, 二维数组的一般说明格式如下 类型数组名 [ 行长度 ][ 列长度 ] 二维数组以行 列矩阵的形式存储 第一个下标代表行, 第二个下标代表列, 这意味着按照在内存中的实际存储顺序访问数组元素时, 右边的下标比左边的下标的变化快一些 例如 : int n[3][2]; // 定义一个整型的二维数组 它共有 6 个元素, 顺序为 :n[0][0],n[0][1],n[1][0],n[1][1],n[2][0],n[2][1] (2) 数组的赋值和初始化二维数组的赋值可以通过将数据分别放在不同的大括号内 ( 每个大括号代表每行的元素 ) 来实现, 也可以通过将所有数据写在一个括号内, 按数组的排列顺序对各元素赋初值 例如 : 115

18 精通 MCS-51 单片机 C 语言编程 int n[3][2]=1,2,3,4,5,6; 或 int n[3][2]=1,2,3,4,5,6; 上述两种方法在结果上是等价的, 都把二维数组初始化为 : 字符数组 字符数组是指用来存放字符类型的数组, 字符数组中, 每一个元素存放一个字符, 可和字符数组存储长度不同的字符串 (1) 字符数组的一般形式 类型数组名 [ 长度 ] 例如 : char first[10] char second[2][8] // 定义了一个共有 10 个字符的一维字符数组 // 定义了一个二维字符数组, 它可容纳 2 个字符串, 每串最长 8 个字符 (2) 字符数组的赋值和初始化 1 一维字符数组初始化 char first[]= j,'a','c','k', ' ','x','u'; // 定义字符数组 first 并以字符形式给每个元素赋初值 char second[]="jack xu"; // 定义字符数组 second 并以字符串的形式赋初值 类型说明时可以不指定数组的长度, 而是由后面的字符或字符串来决定 用字符指定 数组长度, 数组的长度由字符个数确定, 因此在上例中 first 数组长度为 7( 包含一个空格字符 ); 用字符串指定数组长度, 数组和长度由字符串加 1 确定, 这是因此 C51 编译器会自动在字符串的末尾加上结束符转义序列 \0, 所以 second 的长度为 8 2 二维字符数组的初始化若干字符串可以装入一个二维字符数组中, 这个二维字符数组的第 1 个下标是字符串的个数, 第 2 个下标为每个字符串的长度, 该长度应比该组字符串中最长的串多 1 个字符 例如 : char third[][8]= "hello", "jack xu"; 二维字符数组中第 1 个下标可以不指定, 它可由初始化数据自动得到, 但第 2 个下标必须给定, 在上例中, 共有 2 个字符串, 故第 1 个下标为 指针 指针是 C51 语言中的一个重要概念, 使用指针可以灵活 高效地进行程序设计, 是 C51 语言的特色之一 116

19 第 3 章 C51 程序设计 1. 指针的基本概念 为了理解指针的概念, 需要先了解数据在内存中的存储和读取方法 假设先定义了一个变量, 则程序在编译时会在内存中给这个变量分配相应的存储空间, 如整型变量需要两个字节的内存单元, 字符型的则需要一个字节, 而浮点型变量则需要四个字节的内存单元等, 内存区以字节组织, 每个字节有一个编号即内存的地址, 在地址所对应的单元存放的是数据 假设程序中存在三个变量, 分别为整型变量 I=10 j=20, 浮点型变量 k=1.23, 编译时分配的首地址为 1000, 则按照之前的介绍, 字节 1000 和 1001 分配给 I, 字节 1002 和 1003 分配给 j, 字节 1004 到 1007 分配给 k, 变量与内存单元的对应关系中, 变量的变量名 (i j k) 与内存单元的地址相对应, 而变量的值与内存单元的内容对应, 在内存中, 变量名是不存在的, 对变量的存取都是通过地址进行的 数据在内存中的读取有两种方法 (1) 直接存取方法例如 :int a=i*2, 这时读取变量的值是直接找变量 i 在内存中的地址 1000, 然后从 1000 中找到变量的值 10, 再乘以 2 的结果赋给 a, 因此,a=20 (2) 间接存取方法先将 i 的地址存到某一地址中, 比如 1100 和 1101, 此时存取变量 i, 可以先从 1100 中读出 i 的地址 1000, 再找到相应的内存中读取 i 的值 关于指针要区分下面两个概念 (1) 变量的指针 : 就是变量的地址, 如上例中变量 i, 它的指针就是内存中的地址 1000;(2) 指向变量的指针变量 ( 简称指针变量 ): 它是一个专门存放另一个变量地址 ( 指针 ) 的变量, 它的值是指针, 上例中地址 1100 和 1101 两字节存放的变量就是一个指针变量, 它的值就是变量 i 的地址 指针变量的定义若要使用指针变量, 则必须要对它进行定义 指针定义的一般形式为 : 类型 * 变量名在变量名前加 * 表示此变量为指针变量, 而类型则表示该指针变量所指向的变量的类型 例如 : int *ip1; float *ip2; 上例中定义了 2 个指针变量, 分别为整型和浮点型变量, 即 ip1 和 ip2 分别存放整型和浮点型变量的地址 指针变量在定义中允许带初始化项, 如 int I,*ip1=&i; 若不带初始化项, 则指针变量被初始化为 NULL, 即不指向任何有效数据 117

20 精通 MCS-51 单片机 C 语言编程 3. 指针的引用 指针变量的引用是通过取地址运算符 & 来实现的, 例如 : int i=10,j; int *ip; ip=&i; // 定义了两个整型变量 i 和 j, 其中可存入整数 // 定义一个指向整型数的指针变量 ip, 它只能存放整型变量的地址 // 把 i 的地址赋给 ip, 以后可通过 ip 间接访问变量 i 现在可以通过指针变量来对内存进行间接访问了, 这时要用到指针运算符 *, 其形式为 :* 指针变量例如, 要将变量 i 的值赋给 j, 有两种方法 j=i; j=*ip; 4. 指针的运算 // 程序先从指针变量 ip 中读出变量 i 的指针, 然后从此地址的内存中读出变量 i 的值再赋给 j 指针可以进行下面几种运算 (1) 指针可以和整数进行加减运算 (2) 若两个指针指向同一数组, 两个指针变量可以进行关系运算符和减法运算 例如 : 两个指针变量 i 和 j, 若 i==j 为真, 则表示 i j 指向数组的同一元素 ;i-j 则表示 i 和 j 之间的数组元素个数 5. 指针的类型 C51 编译器支持两种不同类型的指针 : 存储器指针和通用指针 (1) 通用指针 通用或未定型的指针的声明和标准 C 语言中一样 例如 : char * s; //* 字符指针 * int * numptr; //* 整型指针 * long * state; //* 长整型指针 * 通用指针总是需要三个字节来存储 : 第一个字节表示存储器类型, 第二个字节是指针的高字节, 第三个字节是指针的低字节 通用指针可以用来访问所有类型的变量, 而不管变量存储在哪个存储空间中 因而, 许多库函数都使用通用指针 通过使用通用指针, 一个函数可以访问数据, 而不用考虑它存储在什么存储器中 (2) 存储器指针 存储器指针或类型确定的指针在定义时包括一个存储器类型说明, 并且总是指向此说明的特定存储器空间 例如 : char data * str; //* 指向内 RAM 低 128B 的字符指针 * int xdata * numtab; //* 指向程序存储区的长整形指针 * 正是由于存储器类型在编译时已经确定, 通用指针中用来表示存储器类型的字节就不再需要了 指向 idata data bdata 和 pdata 的存储器指针用一个字节保存, 指向 code 和 xdata 的存储器指针用两个字节保存 使用存储器指针比通用指针效率要高, 速度要快 当然, 存储器指针的使用不是很方便 在所指向目标的存储空间明确并不会变化的情况下, 它们用得最多 118

21 第 3 章 C51 程序设计 结构与联合 1. 结构 数组是同一类型的数据组合成一个有序的集合, 而结构是把多个不同类型的数据组合在一起的集合, 这些不同的数据表达了该结构的不同信息, 这些数据可以是字符型 整型等基本数据类型, 还可以是数组 指针 枚举等其他结构类型的变量, 这些数据统称为结构体的成员 ( 也称为结构元素 ) (1) 结构说明和结构变量的说明 1 结构说明在对结构使用之前, 需要先对结构进行说明, 说明的格式一般如下 struct 结构名 类型说明符成员 1; 类型说明符成员 2; ; 其中,struct 是结构的关键字, 结构名是结构的标识符, 而不是变量, 结构中的成员类型由类型说明符来定义 例如 : struct person int age; char name; bit sex; ; 在上例中, 定义了一个结构, 其结构名为 person, 它包含了三个成员, 分别用来描述这个 person 的 age name 和 sex, 并且定义了这三个成员的数据类型,age 为整型数据等 结构成员之间是没有顺序的, 对结构成员的访问是通过成员名来实现的 ; 另外, 注意 后面的 ; 是必须要存在的 2 结构变量的说明结构变量是使用结构体定义的结构体变量, 定义结构变量通常有三种方法, 分别如下 第一种 : 定义结构体类型时, 同时定义结构类型变量 struct 结构名 类型说明符成员 1; 类型说明符成员 2; 结构变量 1, 结构变量 2 ; 例如 : struct person 119

22 精通 MCS-51 单片机 C 语言编程 int age; char name; bit sex; Suning,Wanglin; 注意 : 结构名和结构变量的关系, 在上例中, 定义一个结构名 person, 定义两个结构变量 Suning 和 Wanglin, 这两个结构变量都是由 person 的三个成员构成的 第二种 : 先定义结构体类型, 再定义结构体类型变量 struct 结构名 类型说明符成员 1; 类型说明符成员 2; ; 结构名结构变量 1, 结构变量 2 ; 第三种 : 直接定义结构体类型变量 struct 类型说明符成员 1; 类型说明符成员 2; 结构变量 1, 结构变量 2 ; 直接定义的结构变量省略了结构名, 而直接说明结构变量, 由于没有结构名加以区分, 有时会产生错误 (2) 结构变量的初始化和赋值结构变量可以在定义变量的同时进行初始化, 也可以在变量定义后, 单独初始化 下面分别介绍这两种情况所对应的程序 例如 : struct person int age; char name; bit sex; Suning=16,"suning",1;; 或者也可以通过下例程序实现 struct person int age; char name; bit sex; Suning; Suning.age=16; Suning.name="suning"; Suning.sex=1; 在第一种初始化时, 需要注意 = 后面的花括号里的顺序需要与结构成员的顺序和 数据类型相一致 ; 在 C51 中, 不允许对结构体中的成员直接赋初值 120

23 第 3 章 C51 程序设计 (3) 结构变量的引用结构体中能够被引用的是结构变量, 它可以像其他类型的变量一样赋值和运算, 也可以对结构变量的成员单独进行操作, 其一般形式如下 结构变量. 成员名 如上例中的 Suning.age 等 对结构变量只能使用 & 取变量地址 ( 这部分内容参考 小节 ), 或对结构体变 量的成员进行操作, 对成员的操作和普通变量操作方法相同 2. 联合体 联合体又称为共用体, 与结构类似, 也可以存放不同的数据类型, 但它与结构的区别在于联合体所占用的空间并不是所有数据占用的空间的总和, 而是由最大数据占用的空间决定, 因为联合体中所有的数据只是在内存中占用同一空间, 但是不同的时间保留不同的数据, 每一时刻只有一个数据是有效的 (1) 联合体的说明和联合体变量的说明联合体的说明和结构的说明是相似的, 只是联合体的说明是 union 作为关键字的, 对联合体变量的定义也有三种方式, 分别为第一种 : 定义联合体类型的同时定义联合体类型变量 union 联合名 类型说明符成员 1; 类型说明符成员 2; 变量名 1, 变量名 2 ; 例如 : union persondata int class; char office[10]; a, b; 在上例中, 定义了一个联合, 其联合名为 persondata, 它包含了两个成员和对应的数据类型, 并说明了两个联合变量 a 和 b, 说明后的 a b 变量均为 perdata 类型 a b 变量的长度应等于 persondata 的成员中最长的长度, 即等于 office 数组的长度, 共 10 个字节 第二种 : 先定义联合体类型, 再定义联合体类型变量 union 联合名 类型说明符成员 1; 类型说明符成员 2; 联合名变量名 1, 变量名 2 ; 121

24 精通 MCS-51 单片机 C 语言编程 第三种 : 直接定义联合体类型变量 union 类型说明符成员 1; 类型说明符成员 2; 变量名 1, 变量名 2 ; (2) 联合体变量的使用联合体变量的使用和结构体的使用类似, 只能对其中的单个成员进行赋值和引用, 其一般表示方法如下 联合体变量名. 成员名 与结构变量不同的是, 联合体变量在某一时刻, 内存位置只保留某一数据类型和长度 的变量, 所以不能同时引用联合变量成员 枚举 枚举数据类型同样是构造类型, 是一个有名字的某些整型常量的集合, 这些整型常量是该类型变量可取得的所有的合法值 1. 枚举类型的定义和说明枚举类型的关键字是 enum, 它的定义一般格式为 : enum 枚举类型名 枚举值 1, 枚举值 2,... 其中, emun 是定义枚举类型的关键字, 枚举类型名是自定义的数据类型的名字, 枚举值是该数值类型的可能值 比如下面的例子 : enum week SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATERDAY 该例子定义了一个新的数据类型 week, 且 week 类型的数据只能有 7 种取值, 它们是 SUNDAY,MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATERDAY 2. 枚举变量的取值枚举列表中的每一项符号代表一个整数值, 在默认的情况下, 第 1 项符号取值为 0, 第 2 项值为 1, 第 3 项值为 2, 依次类推 此外, 也可以通过初始化, 指定某些项目的符号值, 某项符号值初始化后, 该项后续各项符号值随之依次递增, 例如 : 在上例中,SUNDAY=0,MONDAY=1 等, 也就是说, 第 1 个枚举值代表 0, 第 2 个枚举值代表 1, 这样依次递增 1 不过, 也可以在定义时, 直接指定某个或某些枚举值的数值 比如上面的定义还可以定义为 : enum week MONDAY=1, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATERDAY, SUNDAY 这样的定义下,MONDAY 等于 1,TUESDAY 等于 2, 以此类推 SUNDAY 等于 7 122

25 第 3 章 C51 程序设计 枚举值是常量, 不是变量 它一经定义后, 就不可再改变 ; 枚举元素本身是由系统定 义的一个表示序号的数值 ; 只能把枚举值赋予枚举变量, 不能把元素的数值直接赋予枚举变量 3.5 C51 基本语句 赋值语句 赋值语句是 C51 中最典型的一种语句, 而且也是程序设计中使用频率最高 最基本的语句, 其一般形式为 : 变量 = 表达式 ; 其功能是首先计算 = 右边表达式的值, 再将右边表达式值的类型转换成 = 左边变量的数据类型并赋值给该变量 变量声明语句 51 单片机是 8 位微控制器 用 8 位的字节操作比用整数或长整数类型的操作更有效 但 C 是高级语言, 用其派生的 C51 语言对单片机进行编程时, 数据类型的使用表面上看起来很灵活, 实际上 C51 编译器要用一系列机器指令对其进行复杂的数据类型处理 特别是使用浮点变量时, 将明显增加程序长度和运算时间 所以在定义变量时尽量详细指定变量的类型, 除非程序必须保证运行精度, 在编写 C 程序时, 尽量避免使用大量的不必要的变量类型 另外,C51 编译器支持对变量存储位置的定义, 定位变量的存储位置有利于提高变量访问速度和程序执行效率 如下面的例子 : (1)char data dat1 定义字符型变量 dat1, 分配在内部 RAM 的低 128 字节, 经编译后该变量可通过直接寻址方式访问 (2)float idata x,y,z 定义浮点类型变量 x,y,z, 分配到内部 RAM 中, 可通过间接寻址方式访问 (3)unsigned long xdata array[100] 定义无符号长整型数组 array[100], 将其分配到外 RAM 中, 编译后, 通过 MOVX 访问 (4)unsigned int pdata student_num 定义无符号整型变量 student_num, 将其分配到外 RAM 中, 编译后, 通过 MOVX 指令采用分页的形式访问 (5)char code text[ ] = ENTER PARAMETER 定义字符数组 text[ ] 并赋初始值 ENTER PARAMETER, 将其分配到程序存储区 可通过 MOVC A,@A+DPTR 访问 123

26 精通 MCS-51 单片机 C 语言编程 表达式语句 在表达式之后加上分号 ; 就构成了表达式语句, 执行表达式语句就是计算表达式的值 这是 C51, 也是 C 语言的一个特色 其一般形式为 表达式 ; 例如 : x=1+2; // 赋值语句, 把表达式 1+2 的值赋给 x i++; // 自增 1 语句,i 值增 1 表达式和表达式语句的区别就在有无分号, 需要强调的是分号 ; 是在半角条件下输 入的 复合语句 用一对花括号 括起来的多个语句便组成了一个复合语句, 复合语句在程序中是作为一个整体执行的, 在不发生跳转的前提下, 只要执行该复合语句, 位于该复合语句中的所有语句就会按顺序依次全部执行, 其一般形式如下 语句 1; 语句 2; ; 语句 n; 例如 : int a,b,c; a = b+2; b = c+2; // 定义变量类型 // 执行赋值语句, 给 a 赋新值 // 执行赋值语句, 给 b 赋新值 复合语句中的每个语句都需要用分号结束, 每个语句即可以是简单语句, 也可以是一 个复合语句, 即复合语句允许多个嵌套, 注意 后面不允许有分号 条件语句 条件语句是程序根据判断条件的状态进行跳转的基础, 是模块化程序的重要组成部分 C51 中常用的条件语句有三种 :if 语句 if-else 语句和 else if 语句 if 语句 if 语句是条件语句的最简单的形式, 它的一般形式为 : if ( 条件表达式 ) 语句 ;

27 第 3 章 C51 程序设计 它所实现的功能是当条件表达式为真时, 执行语句, 否则不执行该语句 例 3-7 if 语句 : 实现当 a>b 条件成立时, 将 a 的值赋给 c if(a>b) c=a; 2. if-else 语句 if-else 语句是条件语句的最基本形式,if 语句是 if-else 语句的简化形式 它的一般形式为 : if ( 条件表达式 ) 语句 1; else 语句 2; 其实现功能是当条件表达式为真时, 执行语句 1, 否则执行语句 2 例 3-8 if-else 语句 : 找到两个数 a,b 的最大值, 并把它赋给 c, 当 a>b 条件成立时, 将 a 赋值给 c; 否则, 将 b 赋值给 c if(a>b) c=a; else c=b; 3. else if 语句 else if 语句必须与 if 语句配合使用, 共同形成串行多分支形式的选择结构 ( 参见 小节 ),if-else 语句的一般形式为 : if( 条件表达式 1) 语句 1; else if( 条件表达式 2) 语句 2; else if( 条件表达式 3) 语句 3; else if( 条件表达式 m) 语句 m; else 语句 n; 它实现的功能是依次判断各个条件表达, 如果其中一个表达式的值为 1, 则执行相应的语句, 若所有的条件表达式均为假, 则执行语句 n 例 3-9 else if 语句 : 当 a>b 条件成立时, 将 a 赋值给 c; 否则, 如果 b>a, 则将 b 赋值给 c; 若两个条件 a>b 和 b>a 均不成立时, 则将 c 清零 if(a>b) c=a; else if(b>a) 125

28 精通 MCS-51 单片机 C 语言编程 c=b; else c=0; if 语句和 if-else 语句都是两分支结构, 利用 else if 语句可实现多分支结构 分支结构 的介绍参见 小节 循环语句 在许多实际问题中, 需要进行具有规律性的重复操作, 比如, 用软件实现延时功能时 如果是在一个 12MB 的 51 芯片应用电路中要求实现 1 毫秒的延时, 就要执行 1000 次空语句才能达到延时的目的 ( 当然也可以采用定时器来做, 在此不讨论 ), 写 1000 条空语句非常麻烦, 并且要占用很多的存储空间, 因为我们知道这 1000 条空语句无非使一条空语句重复执行 1000 次, 因此, 可以选择用循环语句来写, 这样不但使程序结构清晰明了, 而且使编程及编译的效率大大提高 在 C51 语言中的循环语句有以下几种 while 语句 while 循环的一般形式为 : while( 条件表达式 ) 语句 ; while 循环表示当条件为真时, 便执行语句 直到条件为假才结束循环, 并继续执行循环程序外的后续语句 例 3-10 编程实现 的整数的累加和 int i=1; int sum=0; while(i<=100) sum +=i; i++; 程序执行时, 先判断 i 的值是否小于等于 100, 然后令 sum 加 i,i 自增 1, 直到 i 不满足条件时程序跳出, 程序执行结果为 do-while 语句 do-while 循环的一般格式为 : do 语句 ; while( 条件表达式 ); do-while 语句先执行一次 do 后面的语句, 再判断条件是否为真, 当条件为真时, 便继

29 第 3 章 C51 程序设计 续执行 do 后面的语句, 直到条件为假才结束循环, 并继续执行循环程序外的后续语句 例 3-11 编程程序实现 的整数的累加计算 int i=1; int sum=0; do sum +=i; i++; while(i<=100); 在本例中, 先执行循环体中的语句, 即先执行 sum 值加 i 的运算, 再实现 i 加 1 的运算, 再判断 i 是否小于等于 100, 若条件为真, 则继续执行循环体, 直到条件满足为止, 程序执行结果为 5050 do-while 循环与 while 循环的不同在于 : 它先执行循环中的语句, 然后判断条件是否为真, 如果为真则继续循环 ; 如果为假, 则终止循环 因此,do-while 循环至少要执行一次循环语句 3. for 语句 for 循环的一般形式为 : for(< 初始化 >; < 条件表达式 >; < 增量 >) 语句 ; 初始化总是一个赋值语句, 它用来给循环控制变量赋初值 ; 条件表达式是一个关系表达式, 它决定什么时候退出循环 ; 增量定义循环控制变量每循环一次后按什么方式变化, 这三个部分之间用 ; 分开 例 3-12 编程实现 的整数的累加和 for(i=1; i<=100; i++) sum +=i; i++; 上例中先给 i 赋初值 1, 判断 i 是否小于等于 100, 若满足则执行语句, 之后值增加 1 再重新判断, 直到 i>100 时循环退出, 其运行结果为 5050 for 循环中的 初始化 条件表达式 和 增量 都是选择项, 即可以缺省, 但 ; 不能缺省 省略了初始化, 表示不对循环控制变量赋初值 省略了条件表达式, 则不做其他处理时便成为死循环 省略了增量, 则不对循环控制变量进行操作, 这时可在语句体中加入修改循环控制变量的语句 程序跳转语句 程序跳转语句主要用于控制程序执行流程, 跳转或转移程序的执行顺序 在 C51 语言 127

30 精通 MCS-51 单片机 C 语言编程中, 主要包括三种跳转语句 :goto 语句 break 语句和 continue 语句 下面将分别进行介绍 1. goto 语句 goto 语句是一种无条件转移语句, 与 BASIC 中的 goto 语句相似 goto 语句的使用格式为 : goto 语句标号 其中标号是一个有效的标识符, 这个标识符加上一个 : 一起出现在函数内某处, 执行 goto 语句后, 程序将跳转到该标号处并执行其后的语句 另外, 标号必须与 goto 语句同处于一个函数中, 但可以不在一个循环层中 通常 goto 语句与 if 条件语句连用, 当满足某一条件时, 程序便跳到标号处运行 一般来讲, 并不提倡使用 goto 语句, 主要因为它会使程序层次不清, 可读性差, 但在多层嵌套退出时, 用 goto 语句比较合理 例 3-13 用 goto 语句和 if 语句构成循环, 实现 1~100 的整数相加 每加一个整数, 便使用 goto 语句跳转到条件判断, 如果已经完成 100 个整数的加法, 则将结果打印输出 128 main() loop: int i,sum=0; i=1; if(i<=100) sum=sum+i; i++; goto loop; printf("%d\n",sum); (1)goto 语句后面语句标号的定义应遵循 C51 标识符定义原则, 且不能使用 C51 的 关键字 ; (2)goto 语句可以从内层循环跳到外层循环, 而不能从外层循环跳到内层循环中 ; (3)goto 语句容易导致程序的逻辑混乱, 需要谨慎使用 2. break 语句 break 语句通常用来跳出循环程序块, 通常用在循环语句和开关语句中 break 语句的一般形式如下所示 : break; 在 C51 程序中,break 语句通常用于以下两种情况 (1) 当 break 用于开关语句 switch 中时, 可使程序跳出 switch, 继而执行 switch 以后的语句 ; 如果没有 break 语句, 则将成为一个死循环而无法退出 (2) 当 break 语句用于 do-while for while 循环语句中时, 可使程序终止循环而执行循环后面的语句, 通常 break 语句总是与 if 语句联在一起, 即满足条件时便跳出循环 例如下面的循环结构 : int i;int sum=0; for(i=1; i<=10; i++)

31 第 3 章 C51 程序设计 if(i=5) break; sum = sum+i; printf("sum=%d",sum); 分析 : 原本 for 循环的终止条件为 i<=10, 但当 i=5 时, 程序执行 break 语句跳出了 for 循环, 直接执行 for 循环后面的 printf 语句, 所以最终输出的结果为 sum=10 break 语句只适用于单分支 if 条件语句, 对于多分支的 if-else 的条件语句不起作用 ; 而且在多层循环中, 一个 break 语句只向外跳一层 如果需要跳出多层循环, 需要多次在每层循环中使用 break 语句 3. continue 语句 continue 语句的作用是跳过循环体中剩余的语句而强行执行下一次循环 其一般形式为 : continue; continue 语句只用在 for while do-while 等循环体中, 常与 if 条件语句一起使用 例如下面的循环结构 int I;int sum=0; for(i=1; i<=10; i++) if(i=5) continue; sum = sum+i; printf( sum=%d,sum); 分析 : 当 i=5 时, 执行 continue 语句后, 程序忽略 sum=sum+5 操作, 重新跳转到了 for 语句, 执行 i=6 的循环, 直到 i<=10 不成立, 再执行 for 循环后面的 printf 语句, 所以最终输出的结果为 sum=50 初学者一般会混淆 continue 语句与 break 语句的用法, 对于二者改变程序执行流程的区别, 可对比图 3-1 所示 由图中可见,break 语句执行后, 程序跳出循环体, 直接执行循环体后面的语句 ;continue 语句执行后, 程序只是跳出当前循环, 跳转到循环体的开始位置执行下一次循环, 并没有跳出循环体, 直到循环体的判断条件不满足, 才跳转到循环体后面的语句继续往下执行 开关语句 开关语句由关键字 switch 和 case 来标识, 主要用于多个分支语句处理的情况, 开关语句的一般形式如下所示 switch( 表达式 ) case 常量表达式 1: 分支语句 1; Break; 129

32 case 常量表达式 2: 分支语句 2; break; case 常量表达式 n: 分支语句 n; Break; default: 分支语句 n+1;[break;] 精通 MCS-51 单片机 C 语言编程 图 3-1 break 语句与 continue 语句执行流程对比 开关语句在执行时, 首先计算 switch 后的表达式的值, 然后与 case 后面的各分支常量表达式相比较, 如果相等时则执行对应的分支语句, 再执行 break 语句跳出 switch 语句 如果分支常量的值没有一个和条件相等, 就执行关键字 default 后的语句,default 后面的 break 为可选项, 因为执行到此处时,switch 语句中已没有其他语句, 即使此处没有 break, 程序也不会再执行其他 case 的分支语句 例 3-14 switch 的开关语句的程序示例 main() int test; for(test=0; test<=10; test++) switch(test) /* 以 test 作为开关依据 */ case 1: /* 如果 test==1 成立 */ printf("test=%d\n", test); /* 输出当前的 test 数值 */ break; /* 退出开关语句 */ case 2: /* 如果 test==2 成立 */ printf("test=%d\n", test); /* 输出当前的 test 数值 */ break; /* 退出开关语句 */ 130

33 第 3 章 C51 程序设计 default: /* 缺省分支 */ printf("error"); /* 输出字符串 error */ break; 分析 : 上面是由 for 语句与 switch-case 语句构成的程序 此处的 for 语句功能是实现将 0~10 的整数分别赋值给 test, 随后,switch-case 语句根据 test 的数值, 分别执行相应的分支语句 当 test=1 时, 程序输出 :test=1; 当 test=2 时, 程序输出 :test=2; 当 test 为其他数值时, 一律输出字符串 error 每个分支语句后的 break 语句必须有, 否则将不能跳出开关语句, 而将继续执行其他 分支 ;case 和 default 后的分支语句可以是多个语句构成的语句体, 但不需要使用 括起来 ; 当要求没有符合的条件时, 可以不执行任何语句, 即可以省略 default 语句, 而直接跳出该开关语句 空语句 如果程序某行只有一个分号 ; 作为语句的结束, 就称之为空语句 空语句是什么也不执行的语句, 在程序中空语句可实现延时功能, 这部分内容在之前的循环语句中已经介绍过了 例如 : while(getchar()!='\n'); 这里的循环体为空语句 本语句的功能是, 只要从键盘输入的字符不是回车则重新输入 实际上, 上面的语句还可以写为 : while(getchar()!='\n') ; 也就是说, 满足 while 条件后执行的语句是空的, 程序指针只是空跳转了一次 另外, C51 还定义了一个空函数语句 nop() 来代替 ;, 可以增加程序的可读性 在使用该函数时需要包含头文件 intrins.h, 然后在需要空语句的位置直接调用 nop 函数即可, 现在用 nop 函数改写上面的例子 : #include <intrins.h> int nop(); void main() while(getchar()!='\n') nop( ); 3.6 C51 的流程控制基本结构 计算机程序是由若干语句构成的, 从程序执行的整个过程看, 程序是按照顺序从初始 131

34 精通 MCS-51 单片机 C 语言编程 语句执行到结尾语句, 但在程序内部, 往往需要对某一段语句重复执行或者有选择地执行, 以达到提高代码效率和代码可读性的目的 C51 语言继承了 C 语言的流程控制功能, 提供了顺序 选择 循环三种流程控制结构, 通过三者的嵌套组合可以让单片机实现更多更复杂的功能 下面分别介绍这三种流程结构 顺序结构 顺序结构是程序中普遍存在的流程控制方式 所谓的顺序, 即编译后的程序在单片机程序空间中的存放顺序, 而顺序结构就是指程序的执行按照程序空间的低位地址向高位地址的顺序而执行, 如图 3-2 所示 图 3-2 顺序结构 例 3-15 顺序结构举例 : 将 2000H 单元的内容拆开, 高半字节存至 2001H 的低 4 位, 低半字节存至 2002H 的低 4 位 #include <reg51.h> main() unsigned char xdata *p=0x2000; /* 指针指向 2000H 单元 */ *(p+2)=(*p)&0x0f; /* 2000H 单元的高 4 位清零, 然后存至 2002H 单元 */ *(p+1)=(*p)>>4; /* 2000H 单元右移 4 位, 然后存 2001H 单元 */ 例 3-16 顺序结构举例 : 设计一个乘法程序, 乘积放在外部 RAM 中的 0000H 单元 void main() unsigned long xdata *p; /* 定义指向外部数据的指针 */ unsigned long x=12345,y=76543,mum; /* 定义参与乘法运算的变量 */ mum=x*y; /* 执行乘法运算 */ p=0; /* 令指针 p 指向外部 RAM 区 0000H 单元 */ *p=num; /* 将乘积存入外部 RAM 区 0000H 单元 */ 选择结构 当程序的执行取决于某个条件的状态时, 通常需要利用选择结构对该状态进行判断并进行相应的操作 选择结构可以分为单分支结构和多分支结构, 多分支结构又可以分为串行多分支结构和并行多分支结构 图 3-3 所示给出了串行多分支结构的程序流程 串行多分支结构一般由 if else 语句构成, 通常以单分支结构作为分支判断依据, 程序最终需要依次在多个单分支结构中选择若干代码执行, 并从整个串行多分支结构的结尾处退出, 请参见例 3-17 进行理解 例 3-17 串行多分支结构举例 : 比较两个数的大小, 将大数存储到片外 RAM 的 0000H 单元, 将小数存到 0001H 单元 如果两个数相等, 则将片外 RAM 的 0002H 单元清零 void main() unsigned xdata *p; /* 定义指向外部数据的指针 */ unsigned a=35,b=78; /* 定义参与运算的变量 */ if (a>b) /* 判断 a 是否大于 b*/ 132

35 第 3 章 C51 程序设计 p=0; *p=a; /* 将 a 存到外部 RAM 区的 0000H 单元 */ p++; p=b; /* 将 b 存到外部 RAM 区的 0001H 单元 */ else if (a<b) /* 判断 b 是否大于 a*/ p=0; *p=b; /* 将 b 存到外部 RAM 区的 0000H 单元 */ p++; p=a; /* 将 a 存到外部 RAM 区的 0001H 单元 */ else if (a==b) /* 判断 a 是否等于 b*/ p=2; *p=0; /* 将外部 RAM 区的 0002H 单元清零 */ 图 3-3 串行多分支结构 分析 : 本例使用 if-else if 语句形成了一个串行分支结构 在判断是否 a>b 成立时, 条件不成立 根据串行分支结构特点, 程序继续向下执行, 判断是否 a<b 成立, 因为 35<78, 所以该条件成立, 程序将 78 存到外部 RAM 的 0000H 单元, 将 35 存到 00001H 单元, 根据图 3-3 所示的串行分支结构图可以看出, 完成变量存储后, 整个选择结构即结束退出, 并不再执行是否 a==b 的判断 并行分支结构使用一个条件作为判断依据, 根据该条件的不同状态选择不同的代码执行, 其结构如图 3-4 所示 并行分支结构一般由开关语句 swith-case 实现, 程序举例可参见例 3-14 与串行分支结构不同, 并行分支结构的各个分支之间是并行关系, 而不是像串行结构各分支之间存在谁先谁后的判断顺序 图 3-4 并行分支结构 133

36 精通 MCS-51 单片机 C 语言编程 循环结构 当给定的条件成立时, 循环结构会重复执行某段程序, 直到条件不成立时为止 给定的条件即称为循环条件, 重复执行的程序段称为循环体 根据循环条件所处的位置, 可以将循环结构分为执行前判断条件和执行后判断条件的循环, 也可以分别称为当型循环和直到型循环 前者先判断循环条件是否满足, 如满足, 则执行循环体, 否则跳转到当前代码块之后继续执行 ; 后者先执行循环体, 然后判断循环条件是否满足, 如满足则重复执行循环体, 否则退出循环 当型循环和直到型循环的结构示意图如图 3-5 所示 直到型循环一般由 do-while 语句实现, 程序例程可参见例 3-11 当型循环一般由 for 及 while 语句实现, 在第 3 章, 我们曾经用汇编语言实现了无符号整数排序的冒泡算法, 现在再用当型循环结构实现同样的功能, 供大家比较和理解, 见例 3-18 图 3-5 当型循环与直到型循环 例 3-18 无符号数排序 基于冒泡法, 用循环结构, 将 6 个无符号数按照从小到大的顺序排列 分析 : 要实现 6 个数的冒泡排序法, 可将数据存储于 1 个包含 6 个整数的数组, 采用双重当型循环进行排序 在第一次外循环过程中, 程序从前向后依次比较相邻的两个数, 如果前数大于后数, 交换两个变量的内容, 否则不交换, 经过 5 次比较后, 从前到后完成一次冒泡, 找到 6 个数中的最大数, 并存入第 6 个字节中 第二次外循环过程与第一次完全相同, 经过 6 2=4 次比较, 将次最大数存于第 5 个字节中, 依次类推, 在执行完 5 次冒泡后, 即可完成 6 个数从小到大的排列 另外, 考虑到有可能出现没有执行完 5 次冒泡就已经完成所有排序的情况, 可以设置一个标志位, 如果在上一次的冒泡过程中没有出现前一个数比后一个数大, 即所有数都是以前小后大的顺序排列, 那么就置位该标志位, 说明已经提前完成 6 个数的排序, 可以提前结束并退出循环, 这样可以提高冒泡排序的效率, 程序如下 #include <stdio.h> 134

37 第 3 章 C51 程序设计 #define N 6 void main() int data[n] = 5, 4, 2, 3, 1, 6; /* 定义用于比较的 6 个整数 */ int i, j, temp; int flag_ok =0; /* 定义标志位, 用于判断是否已提前完成排序 */ for (i = 0; i < N - 1 && flag == 0; i++) /* 设置外循环条件 */ flag = 1; /* 置位标志位 */ for (j = 0; j < N - i - 1; j++) /* 设置内循环条件 */ if (a[j + 1] < a[j]) /* 判断相邻的两个数是否前大后小 */ temp = a[j + 1]; a[j + 1] = a[j]; a[j] = temp; /* 交换相邻两个数的位置 */ flag _OK= 0; /* 清零标志位, 说明未完成排序 */ for (i = 0; i < N; i++) printf("%d ", a[i]); /* 将排序好的 6 个数按整数格式输出 */ 3.7 C51 函数 函数是 C 程序的基本模块,C 程序通常由一个主函数和若干个函数组成, 每一个函数可以用来实现特定的功能 一个 C 程序必须有, 也只能有一个主函数 C51 的主函数名称为 main() 函数, 它是硬件初始化结束后, 最先进入的用户定义的函数, 它可以调用其他函数, 而不允许被其他函数调用 因此,C51 程序由 main() 函数开始, 并由 main() 函数结束 C51 能够兼容标准 C 语言极为丰富的库函数, 还允许用户建立自己定义的函数 用户可以按照模块化的结构, 把具有相对独立功能的算法编成相应的函数, 然后通过调用这些函数实现预期的功能 函数的定义 从主调函数和被调函数之间数据传送的角度区分,C51 中的函数可分为无参函数和有参函数两种 1. 无参函数无参函数即函数定义 函数说明及函数调用中均没有参数传递, 可以返回或不返回函数值, 其定义形式为 : 类型标识符函数名 () 135

38 精通 MCS-51 单片机 C 语言编程 声明部分语句 类型标识符指明了本函数的类型, 实际上是函数返回值的类型, 如 int char 类型等, 如果没有返回值, 则使用 void 标识符 函数名是由用户定义的标识符, 函数名后有一个空括号, 其中无参数, 但括号不可少 在 中的内容为函数体, 其中声明部分是对函数体内部所用到变量的类型说明 例 3-19 无参函数实例 void Hello() printf ("Hello,world \n"); 2. 有参函数 有参函数, 也称为带参函数, 即在函数定义及函数声明时有参数, 可以返回或不返回函数值, 其定义形式为 : 类型标识符函数名 ( 形式参数列表 ) 声明部分语句 有参函数的特点是具有形式参数列表 形式参数在下一节中会具体介绍, 它们是各种类型的变量, 多个参数之间用逗号间隔 形式参数必须在形参列表中给出类型说明 例 3-20 定义一个函数, 用于求两个数的和, 可写为 int sum_ab(int a, int b) int c; c = a+b; return c; 第一行说明 sum_ab 函数是一个整型函数, 其返回的函数值是一个整数 形参为 a b, 均为整型变量 在函数体内, 首先定义整形变量 c, 用于存储 a 与 b 的和, 最后 return 语句把 c 的值返回给主调函数 补充知识 : 中断函数定义 C51 规定了中断函数的定义格式 : 函数类型函数名 ( 参数 ) interrupt 中断号 [using 寄存器组号 ] (1) 函数类型为中断函数的返回类型, 如 void,int 等 ; (2) 函数名由用户定义 ; (3) 参数是需要传递到中断函数中参与运算的变量 ; (4)interrupt 0 指该函数响应外部中断 0; interrupt 1 指该函数响应定时器中断 0; 136

39 第 3 章 C51 程序设计 interrupt 2 指该函数响应外部中断 1; interrupt 3 指该函数响应定时器中断 1; interrupt 4 指该函数响应串行口中断 ; using 寄存器组 告诉编译器在进入中断处理后切换寄存器的 bank 位置, 寄存器组号 =0~3 代表第 r 组寄存器 可忽略, 这里不再详述, 如感兴趣可翻阅 C51 编译器自带的使用说明 函数的参数和函数的值 1. 形式参数和实际参数 在函数调用时也必须给出参数, 称为实际参数 ( 简称为实参 ) 进行函数调用时, 主调函数将把实参的值传送给形参, 供被调函数使用 函数的参数分为形参和实参两种, 形参和实参的功能是在主调函数和被调函数直接作数据传送 形参出现在函数定义中, 在整个函数体内都可以使用, 函数借助形参完成函数对该参数的操作, 形参离开该函数则不能使用 实参出现在主调函数中, 发生函数调用时, 主调函数把实参的值传送给被调函数的形参, 从而实现主调函数向被调函数的数据传送, 数据传入被调函数后, 实参变量不参与被调函数的运算 可以看出, 函数的形参和实参具有以下特点 (1) 形参变量只有在被调用时才分配内存单元, 在调用结束时, 即刻释放所分配的内存单元 因此, 形参只有在函数内部有效 函数调用结束返回主调函数后则不能再使用该形参变量 (2) 实参存储的是实际要传送给形参的数据, 可以是常量 变量 表达式 函数等, 无论实参是何种类型的量, 在进行函数调用时, 它们都必须具有确定的值, 以便把这些值传送给形参 (3) 实参和形参在结构上, 类型上, 顺序上应严格一致, 否则会发生类型不匹配的错误 (4) 函数调用中发生的数据传送是单向的, 在函数调用过程中, 形参的值会根据实参发生改变, 而实参中的值不会因形参而变化, 即只能把实参的值传送给形参, 而不能把形参的值反向地传送给实参 例 3-21 形参与实参参数传递实例 : 以例 3-20 中的 sum_ab() 为被调函数, 编写主程序 main() 完成对 sum_ab() 的调用并完成参数传递 int sum_ab(int a, int b) int c; c = a+b; return c; main() int sum_ab (int a,int b); int x,y,z; printf("input two numbers:\n"); 137

40 精通 MCS-51 单片机 C 语言编程 scanf("%d %d",&x,&y); z= sum_ab (x,y); printf("maxmum=%d",z); sum_ab 函数的定义和功能参见例 3-20 进入主函数后, 在调用 sum_ab 函数之前, 先对 sum_ab 函数进行声明 可以看出函数说明与函数定义中的函数头部分相同, 但是末尾要加分号 从键盘输入变量 x 和 y 的值, 然后调用 sum_ab 函数, 把 x, y 中的值传送给 sum_ab 的形参 a, b sum_ab 函数执行后将 a 和 b 的和 c 返回给变量 z 最后由主函数输出 z 的值 函数的返回值 函数的值是指函数被调用之后, 函数体中的程序返回给主调函数的值 对函数的返回值有以下说明 (1) 函数的值只能通过 return 语句返回主调函数 在函数中允许有多个 return 语句, 但每次调用只能有一个 return 语句被执行, 因此, 只能返回一个函数值 return 语句的一般形式为 : return 表达式 ; 或者为 : return ( 表达式 ); (2) 函数值的类型和函数定义中函数的类型应保持一致 如果两者不一致, 则以函数类型为准, 编译器会自动进行类型转换 (3) 函数返回值的默认类型为整型, 所以如果函数值为整型, 在函数定义时可以省去类型说明 (4) 不返回函数值的函数, 可以明确定义为 空类型, 即 void 类型 一旦函数被定义为空类型后, 就不能在主调函数中使用被调函数的函数值了 例 3-22 下面例子对返回值类型及参数作用范围等使用事项做进一步说明 main() int adding(int n); int n; float fl; printf("input number\n"); scanf("%d",&n); fl=adding(n); printf("fl=%f\n",fl); printf("n in main=%d\n",n); int adding(int n) int i; for(i=n-1;i>=1;i--) n=n+i; printf("n in adding=%d\n",n); return n; 本程序中函数 adding 的功能是求整数 1~n 的加法和 在主函数 main 中,scanf 扫描键盘输入并存入 n 中, 例如, 用键盘输入 100, 则 n=100 在调用 adding 函数时, 整数 100

41 第 3 章 C51 程序设计 被传送给 adding 的形参 adding 函数求得 1~100 之间的整数的加法和 5050 后, 将 5050 返回 程序运行后的输出信息为 : input number 100 n in adding= 5050 fl= n in main= 100 虽然本例的形参变量和实参变量的标识符都为 n, 但这两个变量的作用范围完全不同 在主函数中用 printf 语句输出的 n 值是实参 n 的值 在函数 adding 中用 printf 语句输出了的 n 值是形参运算后最后取得的 n 值 5050 返回主函数后, 因为变量 fl 的类型为浮点型, adding 的返回值被自动转换为浮点型, 即 fl 为 如果 adding 的类型定义为 void, 则在编译主程序中的语句 fl=adding(n) 时会报错 函数的调用 1. 函数调用的一般形式 C51 语言是通过对函数的调用来执行函数体的, 其过程类似于子程序的调用 函数调用的一般形式为 : 函数名 ( 实际参数列表 ) 对无参函数调用时, 则没有上句形式中的实际参数列表, 但括号不能省略 对于有参型函数, 其参数可以是常数 变量或其他构造类型数据及表达式, 若参数存在多个, 各实参之间用逗号分隔, 其形参与实参的数量和类型应一致 2. 函数调用的方式 在 C51 语言中, 可以用以下三种方式调用函数 (1) 函数表达式 : 函数作为表达式中的一项出现在表达式中, 以函数返回值参与表达式的运算, 这种方式要求函数是有返回值的 例如, 例 3-22 中的语句 : fl=adding(n); (2) 函数语句 : 函数调用的一般形式加上分号即构成函数语句, 例如 : printf ("%d",a); scanf ("%d",&b) (3) 函数实参 : 函数作为另一个函数调用的实际参数出现, 这种情况是把该函数的返回值作为实参进行传送, 是第一种调用方式的特例, 因此也是要求该函数必须是有返回值的 例如下面调用函数 adding 的方法 : printf ("%d", adding(n)); 即把 adding 的返回值又作为 printf 函数的实参来使用 3. 被调用函数的声明和函数原型 在主调函数中调用某函数之前应对该被调函数进行说明 ( 声明 ), 这与使用变量之前要先进行变量说明是相同的 在主调函数中对被调函数作说明的目的是使编译系统知道被 139

42 精通 MCS-51 单片机 C 语言编程 调函数返回值的类型, 以便在主调函数中按此种类型对返回值作相应处理 其一般形式为 类型说明符被调函数名 ( 类型形参, 类型形参 ); 或为 类型说明符被调函数名 ( 类型, 类型 ); 括号内给出了形参的类型和形参名, 或只给出形参类型, 便于编译系统进行检错, 以防止可能出现的错误 C 语言中又规定在以下几种情况时可以省去主调函数中对被调函数的函数说明 (1) 如果被调函数的返回值是整型或字符型时, 可以不对被调函数作说明, 系统将自动对被调函数返回值按整型处理 (2) 函数在被调用之前必须已经定义或声明过 当被调函数的函数定义出现在主调函数之前时, 在主调函数中也可以不对被调函数再作说明而直接调用, 例如, 在例 3-21 中, 可以省略语句 int sum_ab (int a,int b); 如在被调用之前没有被定义, 但在函数外预先说明了各函数的类型, 则在以后的各主调函数中, 也可不再对被调函数作声明 例如, 例 3-22 可以改写为 : int adding(int n); main() int n; float fl; printf("input number\n"); scanf("%d",&n); fl=adding(n); printf("fl=%f\n",fl); printf("n in main=%d\n",n); int adding(int n) int i; for(i=n-1;i>=1;i--) n=n+i; printf("n in adding=%d\n",n); return n; (3) 如果使用库函数, 必须把该函数的头文件在源文件头部用 #include 命令包含到本文件中 4. 函数的嵌套调用 C51 语言中的函数之间是平行的, 不允许作嵌套的函数定义, 因此, 不存在上一级函数和下一级函数的问题 但是 C51 语言允许在一个函数的定义中出现对另一个函数的调用, 即在被调函数中又调用其他函数, 这样就形成了函数的嵌套调用 但是受制于单片机的硬件资源限制, 有些 C51 编译器对嵌套的深度有一定限制, 因为每次调用子程序都需要占用一定的 RAM 资源, 所以 C51 无法进行多层次的嵌套调用 140

43 第 3 章 C51 程序设计 5. 函数的递归调用 C51 语言优势之一是它允许函数的递归调用 一个函数在它的函数体内调用它自身称为递归调用, 这种函数即称为递归函数 与嵌套调用不同的是, 在递归调用中, 主调函数又是被调函数 当问题可以通过重复使用一种方法而得以解决的时候, 通常会对函数进行递归调用 运行递归函数将无休止地调用其自身, 这在程序结构设计上是不合适的 为了防止递归调用无终止地进行, 必须在函数内有终止递归调用的手段, 通常加上条件判断, 当满足某种条件后就不再作递归调用, 然后逐层返回 下面举例说明递归调用的执行过程 例 3-23 用递归法计算 n 的阶乘 任何大于 0 的正整数 n 的阶乘可以用下面的递归形式表示 : n!=1 n (n-1)! (n=0,1) (n>1) 说明一个正整数的阶乘是以比它小的整数的阶乘为基础, 其可以理解为一种递归的形式, 可编程如下 : #include "stdio.h" long multi_call(int n) reentrant long result; if(n<0) printf("n<0,input error"); else if(n==0 n==1) result =1; else result =multi_call(n-1)*n; return(result); main() int i; long y; printf("\ninput a inteager number:\n"); scanf("%d",&i); y= multi_call (i); printf("%d!=%ld",i,y); 程序中的函数 multi_call 是一个递归函数 主函数在从键盘输入正整数 n 后调用 multi_call 进入递归函数 multi_call 后, 当 n<0,n=0 或 n=1 时都将快速返回计算结果, 否则就递归调用函数自身 由于每次递归调用的实参为 n 1, 最后当 n 1 的值为 1 时,multi_call 的计算结果为 1, 便终止递归, 并逐层退回 3.8 应用举例 用 C51 实现快速傅里叶变换 音频处理是单片机应用的一个重要领域, 其中音频信号的频域分析是音频处理的一种常见运算 下面的开源例子是 C 语言编写的通用快速傅里叶变换函数, 该例程中, 我们将基于本章学习的变量定义 流程控制及函数调用等知识, 利用快速傅里叶变换方法对时域 141

44 精通 MCS-51 单片机 C 语言编程 信号的频率成分进行分析, 该例子可移植性强, 不依赖于专门的硬件计算电路 例 3-24 用 C51 实现快速傅里叶变换 函数 FFT() 是实现傅里叶变换的核心函数, 此函数用结构体的形式存储一个复数, 函数的输入为待变换信号的时间序列的复数形式, 其中, 复数的虚部初始化为 0; 函数的输出是经过 FFT 变换后的时间序列的复数形式 使用此函数只需更改宏定义 FFT_N 的值即可实现点数的改变,FFT_N 的应该为 2 的 N 次方, 不满足此条件时应在后面补 0 #include <reg52.h> #include <stdio.h> #include<math.h> #define PI // 用 define 定义圆周率 #define FFT_N 64 // 定义傅里叶变换的点数, 受单片机存储空间的限制 struct compx float real,imag;; // 定义复数结构 struct compx result[fft_n]; // 定义 compx 结构类型的变量 result, 用于存储 FFT 的输入和输出, 根据待计算的数据长度自己定义 struct compx Multi(struct compx a,struct compx b) // 定义函数, 对两个复数进行乘法运算 struct compx c; c.real=a.real*b.real-a.imag*b.imag; // 通过访问结构体 c, 实现复数乘法运算 c.imag=a.real*b.imag+a.imag*b.real; return(c); void FFT(struct compx *sig) int f,m,nm1,nv2,i,k,l,j=0; struct compx u,w,t; int sknot,knot,ip; // 函数定义, 功能为对输入的复数组进行快速傅里叶变换 nv2=fft_n/2; // 变址运算, 即把自然顺序变成倒位序, 采用雷德算法 nm1=fft_n-1; for(i=0;i<nm1;i++) //for 循环 if(i<j) // 如果 i<j, 即进行变址 t=sig[j]; sig[j]=sig[i]; sig[i]=t; k=nv2; // 求 j 的下一个倒位序 while(k<=j) //while 循环, 如果 k<=j, 表示 j 的最高位为 1 j=j-k; // 把最高位变成 0 k=k/2; //k/2, 比较次高位, 依次类推, 逐个比较, 直到某个位为 0 j=j+k; f=fft_n; for(l=1;(f=f/2)!=1;l++) // 计算 l 的值, 即计算蝶形级数, 循环体为空语句 142

45 第 3 章 C51 程序设计 ; // 空语句, 与上面的 for 语句构成空循环 for(m=1;m<=l;m++) // 控制蝶形结级数 FFT 运算核, 使用蝶形运算完成 FFT 运算 //m 表示第 m 级蝶形,l 为蝶形级总数 l=log(2)n sknot=2<<(m-1); //sknot 蝶形结距离, 即第 m 级蝶形的蝶形结相距 sknot 点 knot=sknot/2; // 同一蝶形结中参加运算的两点的距离 u.real=1.0; //u 为蝶形结运算系数, 初始值为 1 u.imag=0.0; w.real=cos(pi/knot); //w 为系数商, 即当前系数与前一个系数的商 w.imag=-sin(pi/knot); for(j=0;j<=knot-1;j++) // 循环嵌套, 外层循环用于控制计算不同种蝶形结, 即计算系数不同的蝶形结 for(i=j;i<=fft_n-1;i=i+sknot) // 内层循环用于控制同一蝶形结运算, 即计算系数相同蝶形结 ip=i+knot; //i,ip 分别表示参加蝶形运算的两个节点 t=multi(sig[ip],u); // 调用函数 Multi(), 执行蝶形运算 sig[ip].real=sig[i].real-t.real; sig[ip].imag=sig[i].imag-t.imag; sig[i].real=sig[i].real+t.real; sig[i].imag=sig[i].imag+t.imag; u=multi(u,w); // 调用函数 Multi, 改变运算系数, 准备进行下一个蝶形运算 void main() // 主函数, 用于测试 FFT 变换, 演示函数使用方法 int i; for(i=0;i<fft_n;i++) // 对正弦信号进行采样, 并赋给结构体 result [i].real=1+2*sin(2* *i/fft_n); // 实部为正弦波 FFT_N 点采样 result [i].imag=0; // 虚部为 0 FFT(result); // 函数 FFT, 对数组 result 进行快速傅里叶变换 for(i=0;i<fft_n;i++) // 求变换后结果的模值, 存入复数的实部部分 result [i].real=sqrt(result [i].real* result [i].real+ result [i].imag* result [i].imag); while(1); // 原地跳转等待, 该语句是 while 语句与空语句的缩写 主函数 main 首先对模拟信号进行采样, 该信号为幅值为 1 的直流分量与幅值为 2 的正弦信号的叠加, 如图 3-6(a) 所示 在一个周期内对该信号采样 64 个点, 并将采样点存入 result 结构体中 然后调用 FFT 函数, 对采样数据进行快速傅里叶变换, 将得到的变换结果存入 result 中, 其中, 变换结果的实部存入 real, 虚部存入 imag, 最后调用 sqrt 函数计算 result 的模, 并将模值在图 3-6(b) 中绘出 143

46 精通 MCS-51 单片机 C 语言编程 (a) (b) 图 3-6 参与傅里叶变换的原始信号与计算结果 图 3-6(b) 中的横坐标并不是信号的实际频率, 如果感兴趣, 读者可查阅傅里叶变换的相关文献理解该频率与实际频率之间的关系, 以及幅值与实际信号幅值之间的关系 因为本章主要介绍的是 C51 语言的使用方法, 所以关于傅里叶变换的相关知识在此不赘述 3.9 思考与练习 1.C51 的数据类型有哪些?C51 存储类型有哪些? 2.C51 的 data,bdata,idata 有什么区别? 3. 试说明 xdata 型的指针长度为何要用 2 个字节? 4.C51 中 bit 位与 sbit 位有什么区别? 5. 若 a=3,b=4, 求下列表达式的值!a&&b; b<!(a>b); a&b; (a++,++b,a+b); a>2?3:6; 6. 指针变量和变量指针的区别是什么? 7. 结构与联合的相同和不同之处在于什么? 8. 把带有条件运算符的表达式 max=(a>b)?a:b, 改用 if-else 语句来写 9.break 和 continue 语句的区别是什么? 10. 应用中常遇到求取一组数据的校验和的情况, 试用三种循环结构编写程序, 实现计算 8 个无符号整型数据的加法校验和 11. 用分支结构编程实现下面功能 : 输入 1 时显示 A, 输入 2 时显示 B, 输入 3 时显示 C, 输入 4 时显示 D, 输入 5 时结束 12. 输入 3 个无符号数据, 要求按由大到小的顺序输出 13. 设单片机振荡频率为 12MHz, 试用 C51 编写延时 1s 的延时子程序, 至少写出两种实现方法? 144

chap07.key

chap07.key #include void two(); void three(); int main() printf("i'm in main.\n"); two(); return 0; void two() printf("i'm in two.\n"); three(); void three() printf("i'm in three.\n"); void, int 标识符逗号分隔,

More information

CC213

CC213 : (Ken-Yi Lee), E-mail: feis.tw@gmail.com 49 [P.51] C/C++ [P.52] [P.53] [P.55] (int) [P.57] (float/double) [P.58] printf scanf [P.59] [P.61] ( / ) [P.62] (char) [P.65] : +-*/% [P.67] : = [P.68] : ,

More information

6 C51 ANSI C Turbo C C51 Turbo C C51 C51 C51 C51 C51 C51 C51 C51 C C C51 C51 ANSI C MCS-51 C51 ANSI C C C51 bit Byte bit sbit

6 C51 ANSI C Turbo C C51 Turbo C C51 C51 C51 C51 C51 C51 C51 C51 C C C51 C51 ANSI C MCS-51 C51 ANSI C C C51 bit Byte bit sbit 6 C51 ANSI C Turbo C C51 Turbo C C51 C51 C51 C51 C51 C51 C51 C51 C51 6.1 C51 6.1.1 C51 C51 ANSI C MCS-51 C51 ANSI C C51 6.1 6.1 C51 bit Byte bit sbit 1 0 1 unsigned char 8 1 0 255 Signed char 8 11 128

More information

Microsoft PowerPoint - 5. 指针Pointers.ppt [兼容模式]

Microsoft PowerPoint - 5. 指针Pointers.ppt [兼容模式] 指针 Pointers 变量指针与指针变量 Pointer of a variable 变量与内存 (Variables and Memory) 当你声明一个变量时, 计算机将给该变量一个内存, 可以存储变量的值 当你使用变量时, 计算机将做两步操作 : - 根据变量名查找其对应的地址 ; - 通过地址对该地址的变量内容进行读 (retrieve) 或写 (set) 变量的地址称为变量的指针! C++

More information

2015年计算机二级(C语言)模拟试题及答案(三)

2015年计算机二级(C语言)模拟试题及答案(三) 2016 年计算机二级 (C 语言 ) 模拟试题及答案 (3) 1.( A ) 是构成 C 语言程序的基本单位 A 函数 B 过程 C 子程序 D 子例程 2.C 语言程序从 ( C ) 开始执行 A 程序中第一条可执行语句 B 程序中第一个函数 C 程序中的 main 函数 D 包含文件中的第一个函数 3 以下说法中正确的是( C ) A C 语言程序总是从第一个定义的函数开始执行 B 在 C 语言程序中,

More information

Microsoft PowerPoint - 4. 数组和字符串Arrays and Strings.ppt [兼容模式]

Microsoft PowerPoint - 4. 数组和字符串Arrays and Strings.ppt [兼容模式] Arrays and Strings 存储同类型的多个元素 Store multi elements of the same type 数组 (array) 存储固定数目的同类型元素 如整型数组存储的是一组整数, 字符数组存储的是一组字符 数组的大小称为数组的尺度 (dimension). 定义格式 : type arrayname[dimension]; 如声明 4 个元素的整型数组 :intarr[4];

More information

《C语言程序设计》教材习题参考答案

《C语言程序设计》教材习题参考答案 教材名称 : C 语言程序设计 ( 第 1 版 ) 黄保和 江弋编著清华大学出版社 ISBN:978-7-302-13599-9, 红色封面 答案制作时间 :2011 年 2 月 -5 月 一 选择题 1. 设已定义 int a, * p, 下列赋值表达式中正确的是 :C)p=&a 2. 设已定义 int x,*p=&x;, 则下列表达式中错误的是 :B)&*x 3. 若已定义 int a=1,*b=&a;,

More information

Generated by Unregistered Batch DOC TO PDF Converter , please register! 浙江大学 C 程序设计及实验 试题卷 学年春季学期考试时间 : 2003 年 6 月 20 日上午 8:3

Generated by Unregistered Batch DOC TO PDF Converter , please register! 浙江大学 C 程序设计及实验 试题卷 学年春季学期考试时间 : 2003 年 6 月 20 日上午 8:3 浙江大学 C 程序设计及实验 试题卷 2002-2003 学年春季学期考试时间 : 2003 年 6 月 20 日上午 8:30-10:30 注意 : 答题内容必须写在答题卷上, 写在本试题卷上无效 一. 单项选择题 ( 每题 1 分, 共 10 分 ) 1. 下列运算符中, 优先级最低的是 A.

More information

OOP with Java 通知 Project 2 提交时间 : 3 月 14 日晚 9 点 另一名助教 : 王桢 学习使用文本编辑器 学习使用 cmd: Power shell 阅读参考资料

OOP with Java 通知 Project 2 提交时间 : 3 月 14 日晚 9 点 另一名助教 : 王桢   学习使用文本编辑器 学习使用 cmd: Power shell 阅读参考资料 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 2 提交时间 : 3 月 14 日晚 9 点 另一名助教 : 王桢 Email: 51141201063@ecnu.cn 学习使用文本编辑器 学习使用 cmd: Power shell 阅读参考资料 OOP with Java Java 类型 引用 不可变类型 对象存储位置 作用域 OOP

More information

《计算概论》课程 第十九讲 C 程序设计语言应用

《计算概论》课程 第十九讲  C 程序设计语言应用 计算概论 A 程序设计部分 字符数组与字符串 李戈 北京大学信息科学技术学院软件研究所 lige@sei.pku.edu.cn 字符数组的定义 #include int main() char a[10] = 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j' ; for (int i = 0; i < 10; i++) cout

More information

Microsoft Word - 《C语言开发入门》课程教学大纲-2.doc

Microsoft Word - 《C语言开发入门》课程教学大纲-2.doc C 语言开发入门 课程教学大纲 ( 课程英文名称 ) 课程编号 :201409210011 学分 :5 学分学时 :60 学时 ( 其中 : 讲课学时 :37 学时上机学时 :23 学时 ) 先修课程 : 计算机导论后续课程 :C++ 程序设计适用专业 : 信息及其计算机相关专业开课部门 : 计算机系 一 课程的性质与目标 C 语言开发入门 是计算机各专业必修的基础课程, 是数据结构 C++ Java

More information

<4D F736F F F696E74202D20B5DA32D5C220B5A5C6ACBBFA433531D3EFD1D4BBF9B4A1>

<4D F736F F F696E74202D20B5DA32D5C220B5A5C6ACBBFA433531D3EFD1D4BBF9B4A1> 第 2 章 单片机 C51 语言基础 2.1 C51 语言的基本知识 2.2 运算符与表达式 2.3 指针与绝对地址访问 2.4 本章小结 2.5 实训二发光二极管流水广告灯 返回首页 教学提示 随着单片机开发技术的不断发展, 目前已有越来越多 的人从普遍使用汇编语言逐渐过渡到使用高级语言开发, 其中又以 C 语言为主, 市场上几种常见的单片机均有其 C 语言开发环境 应用于 51 系列单片机开发的

More information

《C语言程序设计》第2版教材习题参考答案

《C语言程序设计》第2版教材习题参考答案 教材 C 语言程序设计 ( 第 2 版 ) 清华大学出版社, 黄保和, 江弋编著 2011 年 10 月第二版 ISBN:978-7-302-26972-4 售价 :35 元 答案版本 本习题答案为 2012 年 2 月修订版本 一 选择题 1. 设已定义 int a, * p, 下列赋值表达式中正确的是 :C)p = &a A. *p = *a B. p = *a C.p = &a D. *p =

More information

没有幻灯片标题

没有幻灯片标题 第 2 章 C 语言的基本数据类型与表达 式 2. 1 C 语言的语法基础 2. 2 C 语言的基本数据类型 2. 3 常量和变量 2. 4 运算符与表达式 2. 5 数据类型转换 用 第 2 章 C 语言的基本数据类型与表达 2.1 C 语言的语法基础 2. 1. 1 C 语言字符集 式 C 语言的基本符号可分 4 个类, 归纳如下 : (1) 英文字母 : 大小写各 26 个, 共计 52 个

More information

Microsoft PowerPoint - 3. 函数Functionl.ppt [兼容模式]

Microsoft PowerPoint - 3. 函数Functionl.ppt [兼容模式] 函数 Function 如何重用代码 How to reuse code 3 4 = 3*3*3*3 3 4,6 5 : 拷贝 - 粘帖代码 (Copy-paste code) 3 4,6 5,12 10 : 拷贝 - 粘帖代码 (Copy-paste code) Bad! 使用函数 (with a function) 使用函数 (with a function) 使用函数 (with a function)

More information

FY.DOC

FY.DOC 高 职 高 专 21 世 纪 规 划 教 材 C++ 程 序 设 计 邓 振 杰 主 编 贾 振 华 孟 庆 敏 副 主 编 人 民 邮 电 出 版 社 内 容 提 要 本 书 系 统 地 介 绍 C++ 语 言 的 基 本 概 念 基 本 语 法 和 编 程 方 法, 深 入 浅 出 地 讲 述 C++ 语 言 面 向 对 象 的 重 要 特 征 : 类 和 对 象 抽 象 封 装 继 承 等 主

More information

51 C 51 isp 10 C PCB C C C C KEIL

51 C 51 isp 10   C   PCB C C C C KEIL http://wwwispdowncom 51 C " + + " 51 AT89S51 In-System-Programming ISP 10 io 244 CPLD ATMEL PIC CPLD/FPGA ARM9 ISP http://wwwispdowncom/showoneproductasp?productid=15 51 C C C C C ispdown http://wwwispdowncom

More information

计算概论A B03 C++语言的基本成分 - 运算成分(2)

计算概论A B03 C++语言的基本成分 - 运算成分(2) 计算概论 A 程序设计部分 C 语言的构成成分 运算成分 李戈 北京大学信息科学技术学院软件研究所 lige@sei.pku.edu.cn C 语言中的运算符 C 语言的运算符范围很宽 求字节数运算符 : sizeof 下标运算符 [ ] 赋值运算符 = 算术运算符 + - * / % 关系运算符 < > == >= > ~

More information

Guava学习之Resources

Guava学习之Resources Resources 提供提供操作 classpath 路径下所有资源的方法 除非另有说明, 否则类中所有方法的参数都不能为 null 虽然有些方法的参数是 URL 类型的, 但是这些方法实现通常不是以 HTTP 完成的 ; 同时这些资源也非 classpath 路径下的 下面两个函数都是根据资源的名称得到其绝对路径, 从函数里面可以看出,Resources 类中的 getresource 函数都是基于

More information

<4D F736F F F696E74202D BDE1B9B9BBAFB3CCD0F2C9E8BCC D20D1ADBBB7>

<4D F736F F F696E74202D BDE1B9B9BBAFB3CCD0F2C9E8BCC D20D1ADBBB7> 能源与动力工程学院 结构化编程 结构化程序设计 循环 循环结构 确定性循环 非确定性循环 I=1 sum=sum+i I = I +1 陈 斌 I>100 Yes No 目录 求和 :1+2+3++100 第四节循环的应用 PROGRAM GAUSS INTEGER I, SUM 计数器 SUM = 0 DO I = 1, 100, 1 SUM = SUM + I print*, I, SUM DO

More information

网C试题(08上).doc

网C试题(08上).doc 学习中心 姓名 学号 西安电子科技大学网络与继续教育学院 高级语言程序设计 (C) 全真试题 ( 闭卷 90 分钟 ) 题号一二三总分 题分 60 20 20 得分 一 单项选择题 ( 每小题 3 分, 共 60 分 ) 1.C 语言程序的基本单位是 A) 程序行 B) 语句 C) 函数 D) 字符 2. 下列四组选项中, 均是不合法的用户标识符的选项是 A)A B)getc C)include D)while

More information

chp3

chp3 Java 软件设计基础 3. 流程控制 3.1 语句控制结构 语句类型 变量声明语句 用来声明变量, 格式为 : 表达式语句 在一个表达式的最后加上一个分号构成的语句, 分号是语句不可缺少的部分, 格式为 : 变量 = 表达式 ; 复合语句 [ 修饰符 ] 类型名变量名 1[, 变量名 2][, ]; [ 修饰符 ] 类型名变量名 1[= 初值 1][, 变量名 2][= 初值 2][, ]; 将相关语句组合在一起就构成复合语句,

More information

PowerPoint 演示文稿

PowerPoint 演示文稿 第 1 章程序设计和 C 语言 1.1 什么是计算机程序 1.2 什么是计算机语言 1.3 C 语言的发展及其特点 1.4 最简单的 C 语言程序 1.5 运行 C 程序的步骤与方法 1.6 程序设计的任务 1.1 什么是计算机程序 程序 : 一组计算机能识别和执行的指令 只要让计算机执行这个程序, 计算机就会自动地 有条不紊地进行工作 计算机的一切操作都是由程序控制的, 离开程序, 计算机将一事无成

More information

Microsoft PowerPoint - C语言课件-9-结构体.pptx

Microsoft PowerPoint - C语言课件-9-结构体.pptx 第九章结构体 郎大鹏 第九章结构体 9.1 结构体类型的声明方法 9.2 结构体类型变量的定义与使用 9.3 结构体数组 9.4 编程举例 9.5 习题 9.1 结构体类型的声明方法 结构体声明的语法形式如下 : struct 结构体标识符 成员变量列表 ; }; 例如, 为了描述班级 ( 假设仅仅包括班级编号 专业 人数等信息 ), 可以声明如下的结构体类型 struct Class char Code[10];

More information

新・明解C言語入門編『索引』

新・明解C言語入門編『索引』 !... 75!=... 48 "... 234 " "... 9, 84, 240 #define... 118, 213 #include... 148 %... 23 %... 23, 24 %%... 23 %d... 4 %f... 29 %ld... 177 %lf... 31 %lu... 177 %o... 196 %p... 262 %s... 242, 244 %u... 177

More information

试卷代号 :1253 座位号 E 口 国家开放大学 ( 中央广播电视大学 )2014 年秋季学期 " 开放本科 " 期末考试 C 语言程序设计 A 试题 2015 年 1 月 E 四! 五 总分! 一 单选题 ( 每小题 2 分, 共 20 分 ) 1. 由 C 语言源程序文件编译而成的目标文件的默

试卷代号 :1253 座位号 E 口 国家开放大学 ( 中央广播电视大学 )2014 年秋季学期  开放本科  期末考试 C 语言程序设计 A 试题 2015 年 1 月 E 四! 五 总分! 一 单选题 ( 每小题 2 分, 共 20 分 ) 1. 由 C 语言源程序文件编译而成的目标文件的默 试卷代号 :1253 座位号 E 口 国家开放大学 ( 中央广播电视大学 )2014 年秋季学期 " 开放本科 " 期末考试 C 语言程序设计 A 试题 2015 年 1 月 E 四! 五 总分! 一 单选题 ( 每小题 2 分, 共 20 分 ) 1. 由 C 语言源程序文件编译而成的目标文件的默认扩展名为 ( ) A. cpp B. c C. exe D. obj 2. 设 x 和 y 均为逻辑值,

More information

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数 复习 类的复用 组合 (composition): has-a 关系 class MyType { public int i; public double d; public char c; public void set(double

More information

《C语言程序设计》教材习题参考答案

《C语言程序设计》教材习题参考答案 教材名称 : C 语言程序设计 ( 第 1 版 ) 黄保和 江弋编著清华大学出版社 ISBN: 978-7-302-13599-9, 红色封面答案制作时间 :2011 年 2 月 -5 月一 思考题 1 函数总需要从 main 中调用吗? 当调用一个函数时, 为什么要使用参数? 函数不是总需要从 main 函数中调用, 使用参数的目的是为了给被调函数传递数据 2 什么是函数的返回值? 是否每个函数都有返回值?

More information

Microsoft PowerPoint - 8. 运算符重载 Operator Overloading.pptx

Microsoft PowerPoint - 8. 运算符重载 Operator Overloading.pptx 运算符重载 Operator Overloading class Point { public: ; double x_, y_; Why Operator Overloading? Point (double x =0, double y = 0):x_(x),y_(y) { int main(){ Point a(1., 2), b(3,4); Point c = a + b; return 0;

More information

期中考试试题讲解

期中考试试题讲解 一 选择题 ( 一 ) 1. 结构化程序设计所规定的三种基本结构是 C A 主程序 子程序 函数 B 树形 网形 环形 C 顺序 选择 循环 D 输入 处理 输出 2. 下列关于 C 语言的叙述错误的是 A A 对大小写不敏感 B 不同类型的变量可以在一个表达式中 C main 函数可以写在程序文件的任何位置 D 同一个运算符号在不同的场合可以有不同的含义 3. 以下合法的实型常数是 C A.E4

More information

运算符重载 为什么要 运算符重载 那些运算符可以重载, 哪些不可以 如何实现运算符重载 实现方式 : 成员函数与非成员函数 类型转换 怎样实现对象与基本数据类型数据的运算 2

运算符重载 为什么要 运算符重载 那些运算符可以重载, 哪些不可以 如何实现运算符重载 实现方式 : 成员函数与非成员函数 类型转换 怎样实现对象与基本数据类型数据的运算 2 第十一讲 运算符重载 与类型转换 运算符重载 为什么要 运算符重载 那些运算符可以重载, 哪些不可以 如何实现运算符重载 实现方式 : 成员函数与非成员函数 类型转换 怎样实现对象与基本数据类型数据的运算 2 为什么要运算符重载 预定义的运算符只针对基本数据类型, 若要对类的对象进行类似的运算, 需要重新定义运算符的功能 运算符重载实质就是函数重载 : 对已有的运算符赋予多重含义, 使得同一个运算符作用于不同类型的数据时导致不同的行为

More information

<4D F736F F D20B5DAC8FDCBC4D5C2D7F7D2B5B4F0B0B82E646F63>

<4D F736F F D20B5DAC8FDCBC4D5C2D7F7D2B5B4F0B0B82E646F63> 第三章 Q3 1 1. 省略了 I/O 操作的复杂逻辑, 易实现, 耗费低 ; 2. 可以利用丰富的内存寻址模式实现灵活的 I/O 操作 Q3 2 假设存储单元 ds1 处寄存器地址为 0x2000, 代码如下 #define ds1 0x2000 while ( *ds1 == 0 ) ; Q3 3 假设设备 (dev1) 中有两个寄存器 ds1 和 dd1,dev1 的地址为 0x1000,ds1

More information

1 Project New Project 1 2 Windows 1 3 N C test Windows uv2 KEIL uvision2 1 2 New Project Ateml AT89C AT89C51 3 KEIL Demo C C File

1 Project New Project 1 2 Windows 1 3 N C test Windows uv2 KEIL uvision2 1 2 New Project Ateml AT89C AT89C51 3 KEIL Demo C C File 51 C 51 51 C C C C C C * 2003-3-30 pnzwzw@163.com C C C C KEIL uvision2 MCS51 PLM C VC++ 51 KEIL51 KEIL51 KEIL51 KEIL 2K DEMO C KEIL KEIL51 P 1 1 1 1-1 - 1 Project New Project 1 2 Windows 1 3 N C test

More information

<4D F736F F F696E74202D2043D3EFD1D4BFCEBCFE2D362DBAAFCAFD2E BBCE6C8DDC4A3CABD5D>

<4D F736F F F696E74202D2043D3EFD1D4BFCEBCFE2D362DBAAFCAFD2E BBCE6C8DDC4A3CABD5D> 第六章函数 郎大鹏 第六章函数 6.1 高效程序的编写方法 6.2 函数的定义 6.3 函数间数据的传递方法 6.4 函数的调用 6.5 函数的嵌套调用 6.6 函数的递归调用 6.7 局部变量和全局变量 6.8 变量的存储类别 6.9 习题 第六章函数 6.1 高效程序的编写方法 6.2 函数的定义 6.3 函数间数据的传递方法 6.4 函数的调用 6.5 函数的嵌套调用 6.6 函数的递归调用

More information

Microsoft PowerPoint - 07 派生数据类型

Microsoft PowerPoint - 07 派生数据类型 能源与动力工程学院 目录 派生类型 陈 斌 固有数据类型 数值型 (numerical) 整型 INTEGER 实型 REAL 复数型 COMPLEX 非数值型 字符型 CHARACTER 逻辑型 ( 布尔型 )LOGICAL 自定义数据类型 ( 派生类型, derived type) 派生类型是指用户利用 Fortran 系统内部类型, 如整型 实型 复数型 逻辑型 字符型等的组合自行创建出一个新的数据类型,

More information

untitled

untitled 不 料 料 例 : ( 料 ) 串 度 8 年 數 串 度 4 串 度 數 數 9- ( ) 利 數 struct { ; ; 數 struct 數 ; 9-2 數 利 數 C struct 數 ; C++ 數 ; struct 省略 9-3 例 ( 料 例 ) struct people{ char name[]; int age; char address[4]; char phone[]; int

More information

新版 明解C++入門編

新版 明解C++入門編 511!... 43, 85!=... 42 "... 118 " "... 337 " "... 8, 290 #... 71 #... 413 #define... 128, 236, 413 #endif... 412 #ifndef... 412 #if... 412 #include... 6, 337 #undef... 413 %... 23, 27 %=... 97 &... 243,

More information

C/C++语言 - C/C++数据

C/C++语言 - C/C++数据 C/C++ C/C++ Table of contents 1. 2. 3. 4. char 5. 1 C = 5 (F 32). 9 F C 2 1 // fal2cel. c: Convert Fah temperature to Cel temperature 2 # include < stdio.h> 3 int main ( void ) 4 { 5 float fah, cel ;

More information

PowerPoint 演示文稿

PowerPoint 演示文稿 4.4.1 逻辑运算符及其优先次序 3 种逻辑运算符 : &&( 逻辑与 ) ( 逻辑或 )!( 逻辑非 ) && 和 是双目 ( 元 ) 运算符! 是一目 ( 元 ) 运算符 逻辑表达式 用逻辑运算符将关系表达式或其他逻辑量连接起来的式子 4.4.1 逻辑运算符及其优先次序 判断年龄在 13 至 17 岁之内? age>=13 && age

More information

帝国CMS下在PHP文件中调用数据库类执行SQL语句实例

帝国CMS下在PHP文件中调用数据库类执行SQL语句实例 帝国 CMS 下在 PHP 文件中调用数据库类执行 SQL 语句实例 这篇文章主要介绍了帝国 CMS 下在 PHP 文件中调用数据库类执行 SQL 语句实例, 本文还详细介绍了帝国 CMS 数据库类中的一些常用方法, 需要的朋友可以参考下 例 1: 连接 MYSQL 数据库例子 (a.php)

More information

第 3 章选择结构 q q q Python 中表示条件的方法 if 语句 选择结构程序设计方法

第 3 章选择结构 q q q Python 中表示条件的方法 if 语句 选择结构程序设计方法 第 3 章选择结构 q q q Python 中表示条件的方法 if 语句 选择结构程序设计方法 3.1 条件的描述 3.1.1 关系运算 Python 的关系运算符有 : =( 大于等于 ) ==( 等于 )!=( 不等于 ) 关系运算符用于两个量的比较判断 由关系运算符将两个表达式连接起来的式子就称为关系表达式, 它用来表示条件, 其一般格式为

More information

OOP with Java 通知 : Project 2 提交时间 : 3 月 14 日晚 9 点 另一名助教 : 王桢

OOP with Java 通知 : Project 2 提交时间 : 3 月 14 日晚 9 点 另一名助教 : 王桢 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 : Project 2 提交时间 : 3 月 14 日晚 9 点 另一名助教 : 王桢 Email: 51141201063@ecnu.cn 复习 : Java 类型 基本类型 boolean, char, 封装 (wrappers) 类 (class) 定义 class MyType { int i;

More information

Microsoft Word - 第3章.doc

Microsoft Word - 第3章.doc 第 3 章流程控制和数组 3.1 实验目的 (1) 熟练掌握控制台应用程序的代码编写和调试, 以及运行方法 (2) 掌握选择结构的一般语法格式和应用 (3) 掌握 switch 语句的用法 (4) 掌握选择结构的嵌套的用法, 能灵活使用选择结构解决实际问题 (5) 掌握 while 循环语句的一般语法格式 (6) 掌握 for 循环语句的一般语法格式 (7) 掌握循环嵌套的语法格式 (8) 掌握一维数组的定义

More information

OOP with Java 通知 : Project 2 提交时间 : 3 月 15 日晚 9 点

OOP with Java 通知 : Project 2 提交时间 : 3 月 15 日晚 9 点 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 : Project 2 提交时间 : 3 月 15 日晚 9 点 复习 : Java 类型 基本类型 boolean, char, 封装 (wrappers) 类 (class) 定义 class MyType { int i; double d; 数据 (Fields) char c; void set(double

More information

Microsoft Word - em78 sub program.doc

Microsoft Word - em78 sub program.doc 一 二进制数转换为 ASCⅡ 码 将一个字节的二进制数转换为两位 16 进制数的 ASCⅡ 码 main: mov a,@0x9f ; 二进制数为 0x9f mov 0x30,a ; 二进制数存入 0x30 mov a,@0x02 mov 0x10,a ;0x10 中存放转换次数 mov a,@0x31 mov 0x04,a ;0x04 中为转换后数据存放地址 mov a,0x30 B1: ; 取

More information

untitled

untitled 1 Outline 數 料 數 數 列 亂數 練 數 數 數 來 數 數 來 數 料 利 料 來 數 A-Z a-z _ () 不 數 0-9 數 不 數 SCHOOL School school 數 讀 school_name schoolname 易 不 C# my name 7_eleven B&Q new C# (1) public protected private params override

More information

( CIP) /. :, ( ) ISBN TP CIP ( 2005) : : : : * : : 174 ( A ) : : ( 023) : ( 023)

( CIP) /. :, ( ) ISBN TP CIP ( 2005) : : : : * : : 174 ( A ) : : ( 023) : ( 023) ( CIP) /. :, 2005. 2 ( ) ISBN 7-5624-3339-9.......... TP311. 1 CIP ( 2005) 011794 : : : : * : : 174 ( A ) :400030 : ( 023) 65102378 65105781 : ( 023) 65103686 65105565 : http: / /www. cqup. com. cn : fxk@cqup.

More information

第一章 绪论

第一章 绪论 C++ 语言程序设计 第二章 C++ 简单程序设计 中国科大 黄章进 本章主要内容 C++ 语言概述 基本数据类型和表达式 数据的输入与输出 算法的基本控制结构 自定义数据类型 深度探索 2 C++ 语言的产生 C++ 语言概述 C++ 是从 C 语言发展演变而来的, 首先是一个更好的 C 引入了类的机制, 最初的 C++ 被称为 带类的 C 1983 年正式取名为 C++ 从 1989 年开始 C++

More information

Microsoft Word - 正文.doc

Microsoft Word - 正文.doc 第 2 章 Java 语言基础 通过本章的实践, 要掌握 Java 中的标识符 关键字 常量, 熟练掌握算术 关 系 逻辑 条件 赋值 位运算符的使用, 掌握简单顺序结构的程序设计 2.1 典型习题解答 2.1 Java 中怎样进行注释? 解答 Java 语言中的注释有 3 种形式 : (1) 单行 : // (2) 多行 : /* */ (3) 文档注释 : /** */ 第三种形式是第二种形式的变形,

More information

nooog

nooog C : : : , C C,,, C, C,, C ( ), ( ) C,,, ;,, ; C,,, ;, ;, ;, ;,,,, ;,,, ; : 1 9, 2 3, 4, 5, 6 10 11, 7 8, 12 13,,,,, 2008 1 1 (1 ) 1.1 (1 ) 1.1.1 ( ) 1.1.2 ( ) 1.1.3 ( ) 1.1.4 ( ) 1.1.5 ( ) 1.2 ( ) 1.2.1

More information

download.kaoyan.com_2006ÄêÌì½ò¹¤Òµ´óѧ¸ß¼¶ÓïÑÔ³ÌÐòÉè¼Æ£¨409£©¿¼ÑÐÊÔÌâ

download.kaoyan.com_2006ÄêÌì½ò¹¤Òµ´óѧ¸ß¼¶ÓïÑÔ³ÌÐòÉè¼Æ£¨409£©¿¼ÑÐÊÔÌâ 考生注意 : 本试卷共七大题, 满分 150 分 考试时间为 3 小时 ; 所有答案均写在答题纸上 ( 注明题号 ), 在此答题一律无效无效 一 选择题 ( 本题共 20 小题, 每小题 2 分, 满分 40 分 ) 1 char ch 1 2 A 0

More information

<4D F736F F F696E74202D BDE1B9B9BBAFB3CCD0F2C9E8BCC D20D1A1D4F1>

<4D F736F F F696E74202D BDE1B9B9BBAFB3CCD0F2C9E8BCC D20D1A1D4F1> 能源与动力工程学院 结构化编程 结构化程序设计 选择 结构化编程的三种基本结构 : 顺序结构 I=1 选择 ( 分支 ) 结构 循环结构 sum=sum+i I = I +1 陈 斌 A?=B NO I>100 No YES Yes 目录 第一节逻辑运算 第一节逻辑运算 第二节 I 语句 逻辑运算 算术运算 关系运算 逻辑运算 关系运算符 运算优先级 第三节浮点数及字符的逻辑运算 90 77 功能

More information

Microsoft PowerPoint - 03.Fortran程序设计基础1

Microsoft PowerPoint - 03.Fortran程序设计基础1 简单 Fortran 90 程序的构造形式 : 第二讲 Fortran 程序设计基础 (2) [PROGRAM 程序名 ] [ 声明语句 ] [ 执行语句 ] END [PROGRAM [ 程序名 ]] 程序的书写 (P5) PROGRAM MONEY!calculate balance after interest compounded! 根据利息计算余额 REAL BALANCE, INTEREST,

More information

untitled

untitled A, 3+A printf( ABCDEF ) 3+ printf( ABCDEF ) 2.1 C++ main main main) * ( ) ( ) [ ].* ->* ()[] [][] ** *& char (f)(int); ( ) (f) (f) f (int) f int char f char f(int) (f) char (*f)(int); (*f) (int) (

More information

OOP with Java 通知 Project 4: 4 月 19 日晚 9 点

OOP with Java 通知 Project 4: 4 月 19 日晚 9 点 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 4: 4 月 19 日晚 9 点 复习 类的复用 组合 (composition): has-a 关系 class MyType { public int i; public double d; public char c; public void set(double x) { d

More information

PowerPoint 演示文稿

PowerPoint 演示文稿 计算概论 A 课程程序设计部分 C++ 语言基本成分 数据成分 李戈 北京大学信息科学技术学院软件研究所 lige@sei.pku.edu.cn 再谈, 我们的进度安排 我们的学习过程 感性理性函数指针等 数据成分运算成分控制成分数组字符串 结构化的程序递归 传统学习过程 数据类型与表达式 输入输出 关系运算 控制语句 函数数组指针结构体 作业练习 感性认识作业练习 ( 以抄程序为主 ) 正常作业练习

More information

STRUCT Tag OptTag ID Tag ID 7..4 Declarators VarDec ID VarDec LB INT RB FunDec ID LP VarList RP ID LP RP VarList ParamDec COMMA VarList ParamDec Param

STRUCT Tag OptTag ID Tag ID 7..4 Declarators VarDec ID VarDec LB INT RB FunDec ID LP VarList RP ID LP RP VarList ParamDec COMMA VarList ParamDec Param 7. 附录 A:C 语言文法 在本附录中, 我们给出 C 语言的文法定义和补充说明 7. 文法定义 7.. Tokens INT /* A sequence of digits without spaces */ FLOAT /* A real number consisting of digits and one decimal point. The decimal point must be surrounded

More information

林子雨《C语言程序设计》讲义PPT

林子雨《C语言程序设计》讲义PPT C 语言程序设计 厦门大学计算机科学系 2013/3/26 林子雨 ziyulin@xmu.edu.cn 2013/3/26 厦门大学非计算机专业本科生公共课 (2012-2013 第 2 学期 ) C 语言程序设计 林子雨厦门大学计算机科学系 E-mail: ziyulin@xmu.edu.cn 个人主页 :http://www.cs.xmu.edu.cn/linziyu 课程提要 第一章绪论 第二章

More information

C 1

C 1 C homepage: xpzhangme 2018 5 30 C 1 C min(x, y) double C // min c # include # include double min ( double x, double y); int main ( int argc, char * argv []) { double x, y; if( argc!=

More information

OOP with Java 通知 Project 2 提交时间 : 3 月 21 日晚 9 点 作业提交格式 学习使用 文本编辑器 cmd, PowerShell (Windows), terminal(linux, Mac)

OOP with Java 通知 Project 2 提交时间 : 3 月 21 日晚 9 点 作业提交格式 学习使用 文本编辑器 cmd, PowerShell (Windows), terminal(linux, Mac) OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 2 提交时间 : 3 月 21 日晚 9 点 作业提交格式 学习使用 文本编辑器 cmd, PowerShell (Windows), terminal(linux, Mac) 复习 面向对象编程 将实际问题分解成不同的对象 不的对象提供不同的服务 对象之间可以传递消息 例子小李深夜

More information

2013 C 1 # include <stdio.h> 2 int main ( void ) 3 { 4 int cases, a, b, i; 5 scanf ("%d", & cases ); 6 for (i = 0;i < cases ;i ++) 7 { 8 scanf ("%d %d

2013 C 1 # include <stdio.h> 2 int main ( void ) 3 { 4 int cases, a, b, i; 5 scanf (%d, & cases ); 6 for (i = 0;i < cases ;i ++) 7 { 8 scanf (%d %d 2013 18 ( ) 1. C pa.c, pb.c, 2. C++ pa.cpp, pb.cpp, Compilation Error cin scanf Time Limit Exceeded 1: A 5 B 5 C 5 D 5 E 5 F 5 1 2013 C 1 # include 2 int main ( void ) 3 { 4 int cases, a, b,

More information

Ps22Pdf

Ps22Pdf C ( CIP) C /. :, 2001. 7 21 ISBN 7-5624 -2355-5. C........ C. TP312 CIP ( 2001 ) 034496 C * * : 7871092 1 /16 : 14. 25 : 356 20017 1 20017 1 : 1 6 000 ISBN 7-5624-2355-5 / TP311 : 21. 00 C, C,,,, C,, (

More information

林子雨《C语言程序设计》讲义PPT

林子雨《C语言程序设计》讲义PPT C 语言程序设计 厦门大学计算机科学系 2012-03-18 林子雨 ziyulin@xmu.edu.cn 2012-03-18 厦门大学非计算机专业本科生公共课 (2011-2012 第 2 学期 ) C 语言程序设计 林子雨厦门大学计算机科学系 E-mail: ziyulin@xmu.edu.cn 个人主页 :http://www.cs.xmu.edu.cn/linziyu 课程提要 第一章绪论

More information

第二章 C++简单程序设计

第二章 C++简单程序设计 第二章 C++ 语言 本章主要内容 C++ 语言概述 基本数据类型 运算表达式 算法的基本控制结构 自定义数据类型 2 C++ 语言的产生 C++ 语言概述 C++ 是从 C 语言发展演变而来的, 首先是一个更好的 C 引入了类的机制, 最初的 C++ 被称为 带类的 C 1983 年正式取名为 C++ 从 1989 年开始 C++ 语言的标准化工作 于 1994 年制定了 ANSI C++ 标准草案

More information

移动平台应用软件开发 C/C++/JAVA 基础 C 中的预处理指令 主讲 : 张齐勋 移动平台应用软件开发 课程建设小组北京大学二零一五年

移动平台应用软件开发 C/C++/JAVA 基础 C 中的预处理指令 主讲 : 张齐勋 移动平台应用软件开发 课程建设小组北京大学二零一五年 移动平台应用软件开发 C/C++/JAVA 基础 C 中的预处理指令 主讲 : 张齐勋 zhangqx@ss.pku.edu.cn 移动平台应用软件开发 课程建设小组北京大学二零一五年 预处理 2 预处理器 C 语言的编译系统分为编译预处理和正式编译 预处理作用 : 对源程序编译之前做一些处理, 生成扩展 C 源程序 预处理器的行为是由预处理指令控制的 宏定义 文件包含 条件编译 #define #ifdef

More information

C PICC C++ C++ C C #include<pic.h> C static volatile unsigned char 0x01; static volatile unsigned char 0x02; static volatile unsigned cha

C PICC C++ C++ C C #include<pic.h> C static volatile unsigned char 0x01; static volatile unsigned char 0x02; static volatile unsigned cha CYPOK CYPOK 1 UltraEdit Project-->Install Language Tool: Language Suite----->hi-tech picc Tool Name ---->PICC Compiler Executable ---->c:hi-picinpicc.exe ( Command-line Project-->New Project-->File Name--->myc

More information

test

test C 语言程序设计教案 计算机科学技术学院基础教学部 前言 一. 教学目的 C 语言程序设计是高等学校本专科生计算机基础教学中的一门必修的公共基础课, 也是学习计算机的入门课 教学目的是通过理论教学和实验操作, 使学生掌握 C 程序编写及操作, 使学生具备在信息化社会里工作 学习和生活所必须的计算机编程知识与基本操作技能, 系统地 正确地建立计算机相关概念, 具备独立读写程序的能力, 并使学有余力的同学对

More information

设计模式 Design Patterns

设计模式 Design Patterns 丁勇 Email:18442056@QQ.com 学习目标 描述 JSP 表达式语言的语法 认识使用 JSP 表达式的优点 在 JSP 中使用表达式语言 表达式语言简介 5 1 EL 为表达式语言 由两个组开发 JSP 标准标签库专家组 JSP 2.0 专家组 JSP 表达式语言的语法 ${EL Expression} JSP EL 表达式用于以下情形 静态文本 标准标签和自定义标签 表达式语言简介

More information

Microsoft Word - YYCXfm.DOC

Microsoft Word - YYCXfm.DOC C 语言程序设计 王曙燕主编曹锰副主编 北京 内容简介 本书共 13 章, 主要内容包括 C 语言的基本概念 基本语法和基本数据结构, 另外, 给出了一个小型超市管理的综合实例, 介绍了 C 语言图形程序设计的基本方法, 还简单介绍了 C++ Visual C++ 和 C# 等面向对象程序设计语言 本书注重应用性和实践性, 通过一些典型算法的解题分析及其实现给读者一些解题示范和启发 每章后面配有习题,

More information

数学软件 Matlab 编程基础 ( 脚本 ) 1

数学软件 Matlab 编程基础 ( 脚本 ) 1 数学软件 Matlab 编程基础 ( 脚本 ) 1 本讲主要内容 M 文件 基本运算 : 算术 关系 逻辑 简单的输入输出 控制结构 : 顺序 选择 循环 2 M 文件 M 文件介绍 用 Matlab 语言编写的程序称为 M 文件 M 文件以.m 为扩展名 M 文件是由若干 Matlab 命令组合在一起构成的, 它可以完成某些操作, 也可以实现某种算法 两类重要的 M 文件 ( 调用方式不同 ) Script:

More information

内容简介 本书以教育部高等学校计算机科学与技术教学指导委员会编制的 关于进一步加强高等学校计算机基础教学的意见暨计算机基础课程教学基本要求 中有关计算机程序设计基础 (C 语言 ) 课程教学基本要求为指导, 结合教育部考试中心最新的全国计算机等级考试二级 (C 语言程序设计 ) 考试大纲要求和作者多

内容简介 本书以教育部高等学校计算机科学与技术教学指导委员会编制的 关于进一步加强高等学校计算机基础教学的意见暨计算机基础课程教学基本要求 中有关计算机程序设计基础 (C 语言 ) 课程教学基本要求为指导, 结合教育部考试中心最新的全国计算机等级考试二级 (C 语言程序设计 ) 考试大纲要求和作者多 普通高等教育 十二五 重点规划教材公共课系列 中国科学院教材建设专家委员会 十二五 规划教材 C 语言程序设计 张淑华朱丽莉主编 于雪晶顾煜新副主编 北京 内容简介 本书以教育部高等学校计算机科学与技术教学指导委员会编制的 关于进一步加强高等学校计算机基础教学的意见暨计算机基础课程教学基本要求 中有关计算机程序设计基础 (C 语言 ) 课程教学基本要求为指导, 结合教育部考试中心最新的全国计算机等级考试二级

More information

《C语言程序设计》教材习题参考答案

《C语言程序设计》教材习题参考答案 教材名称 : C 语言程序设计 ( 第 1 版 ) 黄保和 江弋编著清华大学出版社 ISBN: 978-7-302-13599-9, 红色封面答案制作时间 :2011 年 2 月 -5 月一 选择题 1. 以下数组定义中, 错误的是 :C)int a[3]=1,2,3,4; 2. 以下数组定义中, 正确的是 :B) int a[][2]=1,2,3,4; 3. 设有定义 int a[8][10];,

More information

林子雨《C语言程序设计》讲义PPT

林子雨《C语言程序设计》讲义PPT C 语言程序设计 厦门大学计算机科学系 2012-02-26 林子雨 ziyulin@xmu.edu.cn 2012-02-26 厦门大学非计算机专业本科生公共课 (2011-2012 第 2 学期 ) C 语言程序设计 林子雨厦门大学计算机科学系 E-mail: ziyulin@xmu.edu.cn 个人主页 :http://www.cs.xmu.edu.cn/linziyu 课程提要 第一章绪论

More information

NOWOER.OM m/n m/=n m/n m%=n m%n m%=n m%n m/=n 4. enum string x1, x2, x3=10, x4, x5, x; 函数外部问 x 等于什么? 随机值 5. unsigned char *p1; unsigned long *p

NOWOER.OM m/n m/=n m/n m%=n m%n m%=n m%n m/=n 4. enum string x1, x2, x3=10, x4, x5, x; 函数外部问 x 等于什么? 随机值 5. unsigned char *p1; unsigned long *p NOWOER.OM /++ 程师能 评估. 单项选择题 1. 下 描述正确的是 int *p1 = new int[10]; int *p2 = new int[10](); p1 和 p2 申请的空间 的值都是随机值 p1 和 p2 申请的空间 的值都已经初始化 p1 申请的空间 的值是随机值,p2 申请的空间 的值已经初始化 p1 申请的空间 的值已经初始化,p2 申请的空间 的值是随机值 2.

More information

<4D F736F F D20D7DBBACFCAD4CCE231B2CEBFBCB4F0B0B82E646F63>

<4D F736F F D20D7DBBACFCAD4CCE231B2CEBFBCB4F0B0B82E646F63> 综合测试题一参考答案 一 填空题 ( 表达式求值 )( 本大题共 10 小题, 每小题 1 分, 共 10 分 ) 设各语句的初始化 相同 :int x=3,y=2,z=1; 1. x=y==z x= 0 2. x=!(z>y)&&!x 1 x= 1 3. x=(y++*1/3) x= 0 4. x=((x>y>z)?1:0) x= 0 5. x*=2+3 x= 15 6. x=(++z*y,y++,z%y)

More information

Introduction to Computer Systems /18-243, spring st Lecture, Jan. 12th

Introduction to Computer Systems /18-243, spring st Lecture, Jan. 12th 计算机组成原理习题课 1 授课老师 : 王浩宇 haoyuwang@bupt.edu.cn 1 练习 : 机器数的表示和相互转化 练习 1: 当十六进制数 9B 和 FF 分别表示为原码 补码 反码 移码和无符号数时, 所对应的十进制数各为多少 ( 设机器数采用一位符号位 )? 16 进制 真值 无符号数 原码 ( 真值 ) 反码 ( 真值 ) 补码 ( 真值 ) 移码 ( 真值 ) 9BH 二进制十进制

More information

关于编写硕士研究生入学考试自命题初试科目

关于编写硕士研究生入学考试自命题初试科目 华北水利水电大学 2019 年硕士研究生入学考试初试科目考试大纲 农业综合知识三 ( 科目代码 :341) 考试大纲 考试形式和试卷结构一 试卷分值及考试时间考试时间 180 分钟 (3 个小时 ), 满分 150 分二 考试基本要求本考试大纲适用于报考华北水利水电大学农业工程与信息技术专业硕士研究生入学考试, 该科目包括 : 数据库 c 语言程序设计 计算机网络三部分内容 三 试卷内容及结构数据库部分占

More information

JAVA 单元 2.1 四则运算机 ( 一 ) 单元教学进度设计 教学环节 教学内容 教师学生活动活动 反馈 反馈课前作业完成情况 反馈加分 1. 下面哪些是合法的变量名? ( ) A.2variable 答案 :DEG B..variable2 解答 : C.._whatavariable A:/

JAVA 单元 2.1 四则运算机 ( 一 ) 单元教学进度设计 教学环节 教学内容 教师学生活动活动 反馈 反馈课前作业完成情况 反馈加分 1. 下面哪些是合法的变量名? ( ) A.2variable 答案 :DEG B..variable2 解答 : C.._whatavariable A:/ 单元 2.1 四则运算机 ( 一 ) 单元教学进度设计 教学环节 教学内容 教师学生活动活动 反馈 反馈课前作业完成情况 反馈加分 1. 下面哪些是合法的变量名? ( ) A.2variable 答案 :DEG B..variable2 解答 : C.._whatavariable A:// 不能以数字开头 D._3_ B:// 不能用点和空格 提问 抢答 E.$anothervar C: // 不能用点和空格

More information

3.1 num = 3 ch = 'C' 2

3.1 num = 3 ch = 'C' 2 Java 1 3.1 num = 3 ch = 'C' 2 final 3.1 final : final final double PI=3.1415926; 3 3.2 4 int 3.2 (long int) (int) (short int) (byte) short sum; // sum 5 3.2 Java int long num=32967359818l; C:\java\app3_2.java:6:

More information

格式化字符串 Weifeng Sun School of Software, DLUT

格式化字符串 Weifeng Sun School of Software, DLUT 格式化字符串 Weifeng Sun School of Software, DLUT 格式化字符串漏洞 格式化字符串, 也是一种比较常见的漏洞类型 会触发该漏洞的函数很有限 主要就是 printf 还有 sprintf,fprintf 等等 c 库中 print 家族的函数 >int printf(const char* format,...) 2 / 42 3 / 42 A B 字符串指针 char

More information

Microsoft Word - 综合试题2.doc

Microsoft Word - 综合试题2.doc 综合测试题二 一 选择题 ( 本大题共 10 小题, 每小题 1 分, 共 10 分 ) 1. C 语言中用于结构化程序设计的三种基本结构是 A. 顺序结构 选择结构 循环结构 B. if switch break C. for while do-while D. if for continue 2. 下列关于 C 语言用户标识符的叙述中正确的是 A. 用户标识符中可以出现下划线和中划线 B. 用户标识符中不可以出现中划线,

More information

untitled

untitled 1 1.1 1.2 1.3 1.4 1.5 ++ 1.6 ++ 2 BNF 3 4 5 6 7 8 1.2 9 1.2 IF ELSE 10 1.2 11 1.2 12 1.3 Ada, Modula-2 Simula Smalltalk-80 C++, Objected Pascal(Delphi), Java, C#, VB.NET C++: C OOPL Java: C++ OOPL C# C++

More information

一 关于内存 数据存储 变量分类 局部变量 全局变量 静态变量 请看下面代码, 分析变量类型? int pi = 3; int Area(int r, int *sum) { int b; static int c =0; b = pi * r * r; c += b; *sum = c; retu

一 关于内存 数据存储 变量分类 局部变量 全局变量 静态变量 请看下面代码, 分析变量类型? int pi = 3; int Area(int r, int *sum) { int b; static int c =0; b = pi * r * r; c += b; *sum = c; retu 移动平台应用软件开发 C/C++/JAVA 基础 指针以及指针操作 主讲 : 张齐勋 zhangqx@ss.pku.edu.cn 移动平台应用软件开发 课程建设小组北京大学二零一五年 一 关于内存 数据存储 变量分类 局部变量 全局变量 静态变量 请看下面代码, 分析变量类型? int pi = 3; int Area(int r, int *sum) { int b; static int c =0;

More information

第 1 章 C 语言的发展 特点与程序结构 本章主要介绍了 C 语言的发展 特点和程序结构, 重点阐述了程序设计的基本方法, 包括面向过程的程序设计和面向对象的程序设计 ; 算法的概念及其表示, 包括用自然语言 流程图 伪代码 N-S 流程图的表示方法 ; 最后介绍了 C 语言应用程序的开发过程 1

第 1 章 C 语言的发展 特点与程序结构 本章主要介绍了 C 语言的发展 特点和程序结构, 重点阐述了程序设计的基本方法, 包括面向过程的程序设计和面向对象的程序设计 ; 算法的概念及其表示, 包括用自然语言 流程图 伪代码 N-S 流程图的表示方法 ; 最后介绍了 C 语言应用程序的开发过程 1 C 语言程序设计 电子教程 主编 : 杨健霑副主编 : 汪同庆 1 第 1 章 C 语言的发展 特点与程序结构 本章主要介绍了 C 语言的发展 特点和程序结构, 重点阐述了程序设计的基本方法, 包括面向过程的程序设计和面向对象的程序设计 ; 算法的概念及其表示, 包括用自然语言 流程图 伪代码 N-S 流程图的表示方法 ; 最后介绍了 C 语言应用程序的开发过程 1.1 C 语言的发展与特点 1.1.1

More information

2015年计算机二级(C语言)模拟试题及答案(四)

2015年计算机二级(C语言)模拟试题及答案(四) 2015 年计算机二级 (C 语言 ) 模拟试题及答案 (4) 一 填空题 1 C 语言中基本的数据类型有 : 2 C 语言中普通整型变量的类型说明符为, 在内存中占 字节, 有符号普通整型的数据范围是 3 整数-35 在机内的补码表示为 4 执行下列语句 int a=8;a+=a-=a*a; 后,a 的值是 5 有如下语句:charA[ ]={ I am a student }; 该字符串的长度是,A[3]=

More information

学年本科教学和思政工作情况汇报

学年本科教学和思政工作情况汇报 微机原理与接口技术 第 4 章 8051 的 C 语言与程序设计 浙江大学 王立强 王晓萍 内容提要 4.1 C51 特点 4.1.1 C51 结构特点 4.1.2 C51 与汇编编程的区别 4.1.3 C51 编程的优缺点 4.1.4 C51 与标准 C 的区别 4.1.5 C51 编译器 4.2 C51 基础 4.2.1 数据类型 4.2.2 存储器类型与存储模式 4.2.3 数组 4.2.4

More information

c_cpp

c_cpp C C++ C C++ C++ (object oriented) C C++.cpp C C++ C C++ : for (int i=0;i

More information

ch02_Basic

ch02_Basic 主要内容 C++ 语言概述 C++ 的发展 C++ 源程序结构与书写规范 C++ 编译器和集成开发环境 C++ 编程基础 数据的简单输入输出 2 C++ 语言概述 C++ 语言概述 C++ 的发展 - C++ 是从 C 语言发展演变而来, 可以看成是 C 的超集 - 1980 年由 Bjarne Stroustrup 开发创建 - 1983 年正式取名为 C++,1989 年开始 C++ 的标准化工作

More information

C

C C 2017 4 1 1. 2. while 3. 4. 5. for 6. 2/161 C 7. 8. (do while) 9. 10. (nested loop) 11. 12. 3/161 C 1. I 1 // summing.c: 2 #include 3 int main(void) 4 { 5 long num; 6 long sum = 0L; 7 int status;

More information

untitled

untitled 3 C++ 3.1 3.2 3.3 3.4 new delete 3.5 this 3.6 3.7 3.1 3.1 class struct union struct union C class C++ C++ 3.1 3.1 #include struct STRING { typedef char *CHARPTR; // CHARPTR s; // int strlen(

More information

SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 "odps-sdk" 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基

SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 odps-sdk 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基 开放数据处理服务 ODPS SDK SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 "odps-sdk" 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基础功能的主体接口, 搜索关键词 "odpssdk-core" 一些

More information

PowerPoint 演示文稿

PowerPoint 演示文稿 STC 单片机 C 语言函数 主讲 : 何宾 Email:hebin@mail.buct.edu.cn 2016.03 在标准 C 语言中, 定义函数的格式如下 : 函数返回类型函数名字 ( 数据类型形参 1, 数据类型形参 2,..., 数 据类型形参 N) { } 局部变量定义 ; 表达式语句 ; 函数定义和声明 -- 标准 C 函数定义和声明 函数定义和声明 -- 标准 C 函数定义和声明 其中

More information

1 Project New Project 1 2 Windows 1 3 N C test Windows uv2 KEIL uvision2 1 2 New Project Ateml AT89C AT89C51 3 KEIL Demo C C File

1 Project New Project 1 2 Windows 1 3 N C test Windows uv2 KEIL uvision2 1 2 New Project Ateml AT89C AT89C51 3 KEIL Demo C C File 51 C 51 51 C C C C C C * 2003-3-30 pnzwzw@163.com C C C C KEIL uvision2 MCS51 PLM C VC++ 51 KEIL51 KEIL51 KEIL51 KEIL 2K DEMO C KEIL KEIL51 P 1 1 1 1-1 - 1 Project New Project 1 2 Windows 1 3 N C test

More information

06-statement

06-statement PHP 基本语法 条件 循环 函数杨亮 程序的基本结构 程序 输 入 运算 (+ - x / &! ) 逻辑 ( 条件 循环 递归 ) 输出 辅助 ( 变量 数组 函数 ) 小测验 用你熟悉的程序找出 1~1000 中的所有质数 我们直接看代码好了 if else elseif 1

More information

第5章修改稿

第5章修改稿 (Programming Language), ok,, if then else,(), ()() 5.0 5.0.0, (Variable Declaration) var x : T x, T, x,,,, var x : T P = x, x' : T P P, () var x:t P,,, yz, var x : int x:=2. y := x+z = x, x' : int x' =2

More information

PowerPoint 演示文稿

PowerPoint 演示文稿 第二讲 C++ 编程基础 主要内容 C++ 语言概述 C++ 的发展 C++ 源程序结构与书写规范 C++ 编译器和集成开发环境 C++ 编程基础 数据的简单输入输出 2 C++ 语言概述 C++ 的发展 - C++ 是从 C 语言发展演变而来, 可以看成是 C 的超集 - 1980 年由 Bjarne Stroustrup 开发创建 - 1983 年正式取名为 C++,1989 年开始 C++ 的标准化工作

More information

2015年计算机二级(C语言)模拟试题及答案(四)

2015年计算机二级(C语言)模拟试题及答案(四) 2016 年 计 算 机 二 级 (C 语 言 ) 模 拟 试 题 及 答 案 (4) 一 填 空 题 1 C 语 言 中 基 本 的 数 据 类 型 有 : 2 C 语 言 中 普 通 整 型 变 量 的 类 型 说 明 符 为, 在 内 存 中 占 字 节, 有 符 号 普 通 整 型 的 数 据 范 围 是 3 整 数 -35 在 机 内 的 补 码 表 示 为 4 执 行 下 列 语 句 int

More information

CH559指令周期.doc

CH559指令周期.doc CH55X 汇编指令周期表 CH55X 汇编指令概述 : 型号包含 : a. 指令单周期型号 :CH557 CH558 CH559; b. 指令 4 周期型号 :CH551 CH552 CH553 CH554; c. 非跳转指令的指令周期数与指令字节数相同 ; d. 跳转指令含 MOVC/RET/CALL 通常比字节数多若干个周期 ; e.movc 指令多 4 或 5 个周期 ( 下条指令地址为奇数时多

More information

林子雨《C语言程序设计》讲义PPT

林子雨《C语言程序设计》讲义PPT C 语言程序设计 厦门大学计算机科学系 2013/3/19 林子雨 ziyulin@xmu.edu.cn 2013/3/19 厦门大学非计算机专业本科生公共课 (2012-2013 第 2 学期 ) C 语言程序设计 第 4 章选择结构林子雨 厦门大学计算机科学系 E-mail: ziyulin@xmu.edu.cn 个人主页 :http://www.cs.xmu.edu.cn/linziyu 课程提要

More information