(二)任务目标
通过本任务的学习,使学生理解C语言中标识符、关键字、常量变量等重要概念,掌握C语言在Keil软件中的编写规范,熟练编写控制单片机外设板LED灯闪烁的程序。
知识准备
1.C语言和C51语言简介
C语言是一门面向过程、抽象化的通用程序设计语言,广泛应用于底层开发。C语言能以简易的方式编译、处理低级存储器。单片机C51语言是由C语言继承而来的,和C语言不同的是,C51语言运行于单片机平台,C51语言具有C语言结构清晰的优点,便于学习。单片机C51语言提供了完备的数据类型、运算符及函数供使用。C51语言是一种结构化程序设计语言,可以使用一对花括号“{}”将一系列语句组合成一个复合语句,程序结构清晰明了。C51语言代码执行的效率方面十分接近汇编语言,并且比汇编语言的程序易于理解,便于代码共享。
2.C语言的标识符和关键字
在C语言中,用于标识名字的有效字符序列称为标识符。标识符包括变量名、符号常量名、函数名、数组名、类型名、给类型起的“绰号”等。为程序中的元素命名的其他名字,如a、i、x等,称为用户标识符。用户标识符的命名遵守以下规则:
① 只能有英文字母、数字、下划线三种符号;
② 字母区分大小写——大、小写英文字母表示不同的含义;
③ 首字符不能为数字;
④ 标识符不能使用关键字。
例如C语言标识符可以是abc、abc123、ABc,但不能是123abc。
在C语言中,有一些词语被“注册”了“商标”,称为关键字,也称保留字。由于关键字的词语已被系统“注册”了特殊用途,在为程序中的各种元素命名时,不能使用这些关键字,否则就是“侵权”,程序编译时会报错,编译不通过。
C语言中的系统函数名,如:sin,求正弦的函数名;sqrt,求算术平方根的函数名。这些虽然不属于关键字,但是称为预定义标识符。
用预定义标识符为元素命名,语法上是可以的,但是为了避免误解,尽量不要这样做。C语言关键字见表2-1,在C51中添加了表2-2所示的关键字。
表2-1 C语言关键字
表2-2 C51中添加的关键字
3.C语言的常量与变量
在程序运行过程中,值不能改变的量称为常量;相反地,在程序运行过程中,值可以改变的量称为变量。
直观地,直接写在程序中的数据值,就是常量。
例如,a = 10;中,10就是常量。
还有一种常量是用符号代替的,称为符号常量。
符号常量需要用#define命令定义,如:
表示定义PI是3.14的代替符号,PI是3.14的代号,PI就是3.14。3.14是常量,故PI也是常量。
变量类似于生活中存放物品的盒子,如图2-32所示,用于保存数据。其中,盒子的名字为变量名;盒子里面的内容为变量的值。
在程序中,变量实际代表的是计算机内存中的一块存储空间,存储空间的名称就是变量名,其中存储的内容就是变量的值。
图2-32 变量的定义
如:
表示定义了一个变量a,然后将10放入变量a中保存。
在C语言中,变量必须先定义数据类型,然后才能使用。就像盒子必须先准备好,才能用来储物。
4.C语言的数据类型
C语言中,变量在使用之前必须先定义其数据类型。
例如:
每个数据类型在计算机内存开辟的内存空间不同。
C语言提供的数据类型如图2-33所示,Keil C51编译器支持的数据类型见表2-3。
图2-33 C语言的数据类型
表2-3 C51中的数据类型
续表
5.C语言的运算符和表达式
运算符和表达式是学习程序设计语言的基础,C语言中的运算符表达式如下:
(1) 赋值运算符和赋值表达式
① 赋值运算符。
C语言的赋值运算符为等号,表示形式为“ = ”。
此外,还有复合赋值运算符,后续陆续介绍。
② 赋值表达式。
“ = ”的左侧是变量,右侧是常量、变量、表达式、函数等。“ = ”的含义是将右边的值赋给左侧的变量。程序运行时,先计算右侧值,然后赋给左侧变量。
(2) 算术运算符和算术表达式
对计算机中的数据进行算术运算的运算符,称为算术运算符,包括数学中学到的加、减、乘、除和一些扩展。
① 加法和减法运算符。
加法运算符为“ + ”,使运算符两侧的值相加,两侧的值可以是变量、常量和表达式等。
减法运算符为“-”,使运算符左侧的值减去右侧的值。
② 乘法和除法运算符。
乘法运算符为“*”,使运算符两侧的值相乘。
除法运算符为“/”,使运算符两侧的值相除。“/”左侧的值是被除数,右侧的值是除数。
③ 求模运算符。
求模运算符为“%”,求出左侧整数除以右侧整数的余数。
上面的运算符为二元运算符。所谓二元运算符,即运算符两边有两个操作数。
④ 符号运算符。
“ + ”(正号)不改变操作数的值及符号,“-”(负号)可用于得到一个数的相反数。
⑤ 自增和自减运算符。
自增运算符为“ + + ”,自减运算符为“-- ”。
自增运算符使运算对象递增1,有两种形式:运算符在变量的左侧,称为前缀模式;运算符在变量的右侧,称为后缀模式。
前缀形式指变量的值加1作为表达式的值,同时变量的值加1;后缀形式指将变量的值作为表达式的值,然后变量值加1。
符号运算符、自增和自减运算符为一元运算符。
⑥ 复合赋值运算符。
复合赋值运算符有 + = 、- = 、* = 、/ = 、% = 。
例如,x + = y + 1等同x = x +(y + 1)。
注意:右侧表达式为一个整体。
⑦ 括号()。
与数学上的括号一样,能改变运算的顺序。
⑧ 算术表达式。
使用算术运算符将运算对象连接起来、符合C语言语法规则的式子。
(3) 关系运算符和关系表达式
程序设计中需要经常对运算对象之间的大小进行比较,使用的运算符称为关系运算符,用关系运算符将数值或表达式连接起来的式子就是关系表达式。满足关系表达式运算符关系的结果称为“真”,否则为假。
常用的关系运算符见表2-4。
表2-4 关系运算符
(4) 逻辑运算符和逻辑表达式
有时多个关系表达式组合起来更有用,这时需用逻辑运算符(表2-5)将关系表达式连接起来。用逻辑运算符连接运算对象而组成的表达式就是逻辑表达式。逻辑表达式运算结果:
a&&b,只有a和b都是真时,表达式结果才为真;有一个为假,则表达式结果为假。
a||b,a或b有一个为真,表达式结果为真;a和b都为假,表达式结果为假。
!a,a为真时,表达式结果为假;a为假时,表达式结果为真。
表2-5 逻辑运算符
(5) 条件运算符和条件表达式
条件运算符是C语言中唯一的三目运算符,它需要3个操作数,条件表达式为:
?称为条件运算符。
执行情况:
先计算表达式1的值,若为真,则整个表达式的值为表达式2的值,否则,为表达式3的值。
当有多个条件表达式组成复合条件表达式时,运算顺序是从右向左。
例如,a>b?a:c>d?c:d相当于a>b?a:(c>d?c:d)。
(6) 逗号运算符和逗号表达式
逗号运算符是特殊的运算符,将两个表达式连接起来,一般形式:
执行情况:先求解表达式1,再求解表达式2,最后的结果是表达式2的值。
6.十六进制
① 十六进制数由16个数码符号构成:0、1、2、…、9、A、B、C、D、E、F,其中A、B、C、D、E、F分别代表十进制数的10、11、12、13、14、15,基数是16。
② 进位规则是“逢十六进一”。一般在数的后面加字母H表示这个数是十六进制数。
对于任意的4位十六进制数,可以写成如下形式:
H3H2H1H0 = H3 × 23 + H2 × 22 + H1 × 21 + H0 × 20
例如,(2FCB)H = 2 × 163 + 15 × 162 + 12 × 161 + 11 × 160 = (12235)D。
十进制、二进制、十六进制见表2-6。
表2-6 十进制、二进制、十六进制