单片机C语言的必备基础
对单片机C语言来说,掌握以下几点是必须的,尤其对初学者来讲,更是要熟记的:
单片机C语言的运算符和表达式
1.1运算符的种类、优先级和结合性
C语言中运算符和表达式数量之多,在高级语言中是少见的。正是丰富的运算符和表达式使c语言功能十分完善。这也是c语言的主要特点之一。
C语言的运算符不仅具有不同的优先级,而且还有一个特点,就是它的结合性。在表达式中,各运算量参与运算的先后顺序不仅要遵守运算符优先级别的规定,还要受运算符结合性的制约,以便确定是自左向右进行运算还是自右向左进行运算。这种结合性是其它高级语言的运算符所没有的,因此也增加了c语言的复杂性。
1.2运算符的种类
C语言的运算符可分为以下几类:
1.算术运算符
用于各类数值运算。包括加(+)、减(-)、乘(*)、除(/)、求余(或称模运算,%)、自增(++)、自减(--)共七种。
2.关系运算符
用于比较运算。包括大于(>)、小于(<)、等于(==)、大于等于(>=)、小于等于(<=)和不等于(!=)六种。
3.逻辑运算符
用于逻辑运算。包括与(&&)、或(||)、非(!)三种。
4.位操作运算符
参与运算的量,按二进制位进行运算。包括位与(&)、位或(|)、位非(~)、位异或(^)、左移(<<)、右移(>>)六种。
5.赋值运算符
用于赋值运算,分为简单赋值(=)、复合算术赋值(+=,-=,*=,/=,%=)和复合位运算赋值(&=,|=,^=,>>=,<<=)三类共十一种。
6.条件运算符
这是一个三目运算符,用于条件求值(?:)。
7.逗号运算符
用于把若干表达式组合成一个表达式(,)。
8.指针运算符
用于取内容(*)和取地址(&)二种运算。
9.求字节数运算符
用于计算数据类型所占的字节数(sizeof)。
10.特殊运算符
有括号(),下标[],成员(→,.)等几种。
1.3优先级和结合性
C语言中,运算符的运算优先级共分为15级。1级最高,15级最低。在表达式中,优先级较高的先于优先级较低的进行运算。而在一个运算量两侧的运算符优先级相同时,则按运算符的结合性所规定的结合方向处理。
C语言中各运算符的结合性分为两种,即左结合性(自左至右)和右结合性(自右至左)。例如算术运算符的结合性是自左至右,即先左后右。如有表达式x-y+z则y应先与“-”号结合,执行x-y运算,然后再执行+z的运算。这种自左至右的结合方向就称为“左结合性”。而自右至左的结合方向称为“右结合性”。最典型的右结合性运算符是赋值运算符。如x=y=z,由于“=”的右结合性,应先执行y=z再执行x=(y=z)运算。 c语言运算符中有不少为右结合性,应注意区别,以避免理解错误。
1.4 算术运算符和算术表达式基本的算术运算符
1.加法运算符“+”加法运算符为双目运算符,即应有两个量参与加法运算。如a+b,4+8等。具有右结合性。
2.减法运算符“-”减法运算符为双目运算符。但“-”也可作负值运算符,此时为单目运算,如-x,-5等具有左结合性。
3.乘法运算符“*”双目运算,具有左结合性。
4.除法运算符“/”双目运算具有左结合性。参与运算量均为整型时,结果也为整型,舍去小数。如果运算量中有一个是实型,则结果为双精度实型。
void main(){ printf("\n\n%d,%d\n",20/7,-20/7); printf("%f,%f\n",20.0/7,-20.0/7); } 双目运算具有左结合性。参与运算量均为整型时,结果也为整型,舍去小数。如果运算量中有一个是实型,则结果为双精度实型。 printf("\n\n%d,%d\n",20/7,-20/7); printf("%f,%f\n",20.0/7,-20.0/7); 本例中,20/7,-20/7的结果均为整型,小数全部舍去。而20.0/7和-20.0/7由于有实数参与运算,因此结果也为实型。
5.求余运算符(模运算符)“%”双目运算,具有左结合性。要求参与运算的量均为整型。求余运算的结果等于两数相除后的余数。
void main(){ printf("%d\n",100%3); }
双目运算,具有左结合性。求余运算符%要求参与运算的量均为整型。本例输出100除以3所得的余数1。
自增1,自减1运算符
自增1运算符记为“++”,其功能是使变量的值自增1。自减1运算符记为“--”,其功能是使变量值自减1。自增1,自减1运算符均为单目运算,都具有右结合性。可有以下几种形式: ++i i自增1后再参与其它运算。--i i自减1后再参与其它运算。
i++i参与运算后,i的值再自增1。
i--i参与运算后,i的值再自减1。
在理解和使用上容易出错的是i++和i--。特别是当它们出在较复杂的表达式或语句中时,常常难于弄清,因此应仔细分析。
void main(){ int i=8; printf("%d\n",++i); printf("%d\n",--i); printf("%d\n",i++); printf("%d\n",i--); printf("%d\n",-i++); printf("%d\n",-i--); } i<--8 i<--i+1 i<--i-1 i<--i+1 i<--i-1 i<--i+1 i<--i-1 int i=8; printf("%d\n",++i); printf("%d\n",--i); printf("%d\n",i++); printf("%d\n",i--); printf("%d\n",-i++); printf("%d\n",-i--); i的初值为8 第2行i加1后输出故为9; 第3行减1后输出故为8; 第4行输出i为8之后再加1(为9); 第5行输出i为9之后再减1(为8); 第6行输出-8之后再加1(为9); 第7行输出-9之后再减1(为8) void main(){ int i=5,j=5,p,q; p=(i++)+(i++)+(i++); q=(++j)+(++j)+(++j); printf("%d,%d,%d,%d",p,q,i,j); } i<--5,j<--5,p<--0,q<--0 i+i+i--->p,i+1-->i,i+1-->i,i+1-->i j+1->j,j+1->j,j+1->j,j+j+j->q int i=5,j=5,p,q; p=(i++)+(i++)+(i++); q=(++j)+(++j)+(++j); 这个程序中,对p=(i++)+(i++)+(i++)应理解为三个i相加,故p值为15。然后i再自增1三次相当于加3故i的最后值为8。而对于q的值则不然,q=(++j)+(++j)+(++j)应理解为q先自增1,再参与运算,由于q自增1三次后值为8,三个8相加的和为24,j的最后值仍为8。算术表达式表达式是由常量、变量、函数和运算符组合起来的式子。一个表达式有一个值及其类型,它们等于计算表达式所得结果的值和类型。表达式求值按运算符的优先级和结合性规定的顺序进行。单个的常量、变量、函数可以看作是表达式的特例。
二、单片机C语言常用关键字
以下是常用的关键字,是学好C语言的必备基础:
关键字 用 途 说 明
auto 存储种类说明 用以说明局部变量,缺省值为此
break 程序语句 退出最内层循环
case 程序语句 Switch语句中的选择项
char 数据类型说明 单字节整型数或字符型数据
const 存储类型说明 在程序执行过程中不可更改的常量值
continue 程序语句 转向下一次循环
default 程序语句 Switch语句中的失败选择项
do 程序语句 构成do..while循环结构
double 数据类型说明 双精度浮点数
else 程序语句 构成if..else选择结构
enum 数据类型说明 枚举
extern 存储种类说明 在其他程序模块中说明了的全局变量
flost 数据类型说明 单精度浮点数
for 程序语句 构成for循环结构
goto 程序语句 构成goto转移结构
if 程序语句 构成if..else选择结构
int 数据类型说明 基本整型数
long 数据类型说明 长整型数
register 存储种类说明 使用CPU内部寄存的变量
return 程序语句 函数返回
short 数据类型说明 短整型数
signed 数据类型说明 有符号数,二进制数据的最高位为符号位
sizeof 运算符 计算表达式或数据类型的字节数
static 存储种类说明 静态变量
struct 数据类型说明 结构类型数据
swicth 程序语句 构成switch选择结构
typedef 数据类型说明 重新进行数据类型定义
union 数据类型说明 联合类型数据
unsigned 数据类型说明 无符号数数据
void 数据类型说明 无类型数据
volatile 数据类型说明 该变量在程序执行中可被隐含地改变
while 程序语句 构成while和do..while循环结构
附表1-1 ANSIC标准关键字
关键字 用 途 说 明
bit 位标量声明 声明一个位标量或位类型的函数
sbit 位标量声明 声明一个可位寻址变量
Sfr 特殊功能寄存器声明 声明一个特殊功能寄存器
Sfr16 特殊功能寄存器声明 声明一个16位的特殊功能寄存器
data 存储器类型说明 直接寻址的内部数据存储器
bdata 存储器类型说明 可位寻址的内部数据存储器
idata 存储器类型说明 间接寻址的内部数据存储器
pdata 存储器类型说明 分页寻址的外部数据存储器
xdata 存储器类型说明 外部数据存储器
code 存储器类型说明 程序存储器
interrupt 中断函数说明 定义一个中断函数
reentrant 再入函数说明 定义一个再入函数
using 寄存器组定义 定义芯片的工作寄存器
附录二 AT89C51特殊功能寄存器列表(适用于同一架构的芯片)带*号的特殊功能寄存器都是可以位寻址的寄存器
符 号 地 址 注 释
*ACC E0H 累加器
*B F0H 乘法寄存器
*PSW D0H 程序状态字
SP 81H 堆栈指针
DPL 82H 数据存储器指针低8位
DPH 83H 数据存储器指针高8位
*IE A8H 中断允许控制器
*IP D8H 中断优先控制器
*P0 80H 端口0
*P1 90H 端口1
*P2 A0H 端口2
*P3 B0H 端口3
PCON 87H 电源控制及波特率选择
*SCON 98H 串行口控制器
SBUF 99H 串行数据缓冲器
*TCON 88H 定时器控制
TMOD 89H 定时器方式选择
TL0 8AH 定时器0低8位
TL1 8BH 定时器1低8位
TH0 8CH 定时器0低8位
TH1 8DH 定时器1高8位
附录三 运算符优先级和结合性
级 别 类 别 名 称 运算符 结合性
1 强制转换、数组、
结构、联合 强制类型转换 ( ) 右结合
下标 [ ]
存取结构或联合成员 ->或.
2 逻 辑 逻辑非 ! 左结合
字 位 按位取反 ~
增 量 加一 ++
减 量 减一 --
指 针 取地址 &
取内容 *
算 术 单目减 -
长度计算 长度计算 sizeof
3 算 术 乘 * 右结合
除 /
取模 %
4 算术和指针运算 加 +
减 -
5 字 位 左移 <<
右移 >>
6 关系 大于等于 >=
大于 >
小于等于 <=
小于 <
7 恒等于 ==
不等于 !=
8 字 位 按位与 &
9 按位异或 ^
10 按位或 |
11 逻 辑 逻辑与 && 左结合
12 逻辑或 ||
13 条 件 条件运算 ?:
14 赋 值 赋值 =
复合赋值 Op=
15 逗 号 逗号运算 , 右结合
void main(){ int i=8; printf("%d\n",++i); printf("%d\n",--i); printf("%d\n",i++); printf("%d\n",i--); printf("%d\n",-i++); printf("%d\n",-i--); } i<--8 i<--i+1 i<--i-1 i<--i+1 i<--i-1 i<--i+1 i<--i-1 int i=8; printf("%d\n",++i); printf("%d\n",--i); printf("%d\n",i++); printf("%d\n",i--); printf("%d\n",-i++); printf("%d\n",-i--); i的初值为8 第2行i加1后输出故为9; 第3行减1后输出故为8; 第4行输出i为8之后再加1(为9); 第5行输出i为9之后再减1(为8); 第6行输出-8之后再加1(为9); 第7行输出-9之后再减1(为8) void main(){ int i=5,j=5,p,q; p=(i++)+(i++)+(i++); q=(++j)+(++j)+(++j); printf("%d,%d,%d,%d",p,q,i,j); } i<--5,j<--5,p<--0,q<--0 i+i+i--->p,i+1-->i,i+1-->i,i+1-->i j+1->j,j+1->j,j+1->j,j+j+j->q int i=5,j=5,p,q; p=(i++)+(i++)+(i++); q=(++j)+(++j)+(++j); 这个程序中,对p=(i++)+(i++)+(i++)应理解为三个i相加,故p值为15。然后i再自增1三次相当于加3故i的最后值为8。而对于q的值则不然,q=(++j)+(++j)+(++j)应理解为q先自增1,再参与运算,由于q自增1三次后值为8,三个8相加的和为24,j的最后值仍为8。算术表达式表达式是由常量、变量、函数和运算符组合起来的式子。一个表达式有一个值及其类型,它们等于计算表达式所得结果的值和类型。表达式求值按运算符的优先级和结合性规定的顺序进行。单个的常量、变量、函数可以看作是表达式的特例。
上面这一段看看还行,千万别这样用,那是考试用来搞学生的。可以搜一下C语言序列点,副作用。
一周热门 更多>