墨绿三号 发表于 2013-4-24 17:22:22

单片C语言必备-运算符与关键字集

单片机C语言的必备基础
对单片机C语言来说,掌握以下几点是必须的,尤其对初学者来讲,更是要熟记的:
单片机C语言的运算符和表达式
1.1运算符的种类、优先级和结合性
  C语言中运算符和表达式数量之多,在高级语言中是少见的。正是丰富的运算符和表达式使c语言功能十分完善。这也是c语言的主要特点之一。
  C语言的运算符不仅具有不同的优先级,而且还有一个特点,就是它的结合性。在表达式中,各运算量参与运算的先后顺序不仅要遵守运算符优先级别的规定,还要受运算符结合性的制约,以便确定是自左向右进行运算还是自右向左进行运算。这种结合性是其它高级语言的运算符所没有的,因此也增加了c语言的复杂性。
  
1.2运算符的种类
  C语言的运算符可分为以下几类:
  1.算术运算符
  用于各类数值运算。包括加(+)、减(-)、乘(*)、除(/)、求余(或称模运算,%)、自增(++)、自减(--)共七种。
  2.关系运算符
  用于比较运算。包括大于(>)、小于(<)、等于(==)、大于等于(>=)、小于等于(<=)和不等于(!=)六种。
  3.逻辑运算符
  用于逻辑运算。包括与(&amp;&amp;)、或(||)、非(!)三种。
  4.位操作运算符
  参与运算的量,按二进制位进行运算。包括位与(&amp;)、位或(|)、位非(~)、位异或(^)、左移(<<)、右移(>>)六种。
  5.赋值运算符
  用于赋值运算,分为简单赋值(=)、复合算术赋值(+=,-=,*=,/=,%=)和复合位运算赋值(&amp;=,|=,^=,>>=,<<=)三类共十一种。
  6.条件运算符
  这是一个三目运算符,用于条件求值(?:)。
  7.逗号运算符
  用于把若干表达式组合成一个表达式(,)。
  8.指针运算符
  用于取内容(*)和取地址(&amp;)二种运算。
  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        逗 号        逗号运算        ,        右结合

devcang 发表于 2013-4-24 23:27:38

是一个总结。


其实,正文也是C语言基础。

oldmen 发表于 2013-4-25 00:26:34

记号   

juncheng88 发表于 2013-4-25 08:08:08

收藏了,,对于初学还是不错的。

绿茶山人 发表于 2013-4-25 10:04:19

在理解和使用上容易出错的是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语言序列点,副作用。
页: [1]
查看完整版本: 单片C语言必备-运算符与关键字集