(玩电子) 电子技术学习与研究
当前位置单片机教程网 >> 基础教程 >> 浏览文章

第八课 运算符和表达式(位运算符)

作者:佚名   来源:本站原创   点击数:x  更新时间2007年07月17日   字体

学过汇编的朋友都知道汇编对位的处理能力是很强的但是单片机C语言也能对运算对象进行按位操作从而使单片机C语言也能具有一定的对硬件直接进行操作的能力位运算符的作用前位对变量进行运算但是并不改变参与运算的变量的值如果要求按位改变变量的值则要利用相应的赋值运算还芯是位运算符是不能用来对浮点型数据进行操作的单片机c语言中共有6种位运算符位运算一般的表达形式如下

变量 1  位运算符  变量 2 位运算符也有优先级从高到低来是:~(按位取反)<<(左移)  >>(右

移)  &(按位与)^(按位异或)|(按位或)

表 81 是位逻辑运算符的真值表X 表示变量 1Y 表示变量 2

X

Y

~X

~Y

X&Y

X|Y

X^Y

0

0

1

1

0

0

0

0

1

1

0

0

1

1

1

0

0

1

0

1

1

1

1

0

0

1

1

0

表 81    按位取反与或和异或的逻辑真值表

利用以前建立起来的实验板我们来做个实验验证一下位运算是否真是不改变参与变量 的值同时学习位运算的表达形式程序很简单用 P1 口做运算变量P1.0-P1.7 对应 P1 变量的最低位到最高位通过连接在 P1 口系 LED 我们便能直观看到每个位运算后变量 是否有改变或如何改变程序如下

#include  <at89x51.h>

void  main(void)

{

unsigned  int  a;

unsigned  int  b;

unsigned  char  temp;  //临时变量

P1  =  0xAA;  //点亮 D1,D3,D5,D7  P1 口的二进制为 10101010,为 0 时点亮 LED

for  (a=0;a<1000;a++)

for  (b=0;b<1000;b++);  //延时

temp = P1 & 0x7; //单纯的写 P1|0x7 是没有意义的因为没有变量被影响不会被编译

//执行 P10x7 后结果存入temp这个时候改变的是 temp但 P1 不会被影响

//这个时候 LED 没有变化仍然是 D1,D3,D5,D7 亮

for  (a=0;a<1000;a++)

for  (b=0;b<1000;b++);  //延时 P1  =  0xFF;  //熄灭 LED

for  (a=0;a<1000;a++)

for  (b=0;b<1000;b++);  //延时

P1  =  0xAA;  //点亮 D1,D3,D5,D7  P1 口的二进制为 10101010,为 0 时点亮 LED

for  (a=0;a<1000;a++)

for  (b=0;b<1000;b++);  //延时


P1  =  P1  &  0x7;  //这个时候 LED 会变得只有 D2 灭

//因为之前 P1=0xAA=10101010

//与 0x7 位与     0x7=00000111

//结果存入 P1     P1=00000010  //位为 O 时点亮 LED电路看第三课

for  (a=0;a<1000;a++)

for  (b=0;b<1000;b++);  //延时 P1  =  0xFF;  //熄灭 LED

while(1);

//大家能根据上面的程序去做位或左移取反等取

}

复合赋值运算符

复合赋值运算符就是在赋值运算符=的前面加上其他运算符以下是 C 语言中的复 合赋值运算符

+=

加法赋值

>>=

右移位赋值

-=

减法赋值

&=

逻辑与赋值

*=

乘法赋值

|=

逻辑或赋值

/=

除法赋值

^=

逻辑异或赋值

%=    取模赋值       -=    逻辑非赋值

<<=  左移位赋值 复合运算的一般形式为

变量    复合赋值运算符    表达式 其含义就是变量与表达式先进行运算符所要求的运算再把运算结果赋值给参与运算的

变量其实这是 C 语言中一种简化程序的一种方法凡是二目运算都能用复合赋值运算符 去简化表达例如

a+=56 等价于 a=a+56

y/=x+9  等价于  y=y/(x+9) 很明显采用复合赋值运算符会降低程序的可读性但这样却能使程序代码简单化并

能提高编译的效率对于开始学习 C 语言的朋友在编程时最好还是根据自己的理解力和习惯去使 用程序表达的方式不要一味追求程序代码的短小

逗号运算符

如果你有编程的经验那么对逗号的作用也不会陌生了如在 VB 中Dim a,b,c的逗 号就前多个变量定义为同一类型的变量在 C 也一样如int a,b,c,这些例子得逗 号用于分隔表达式用但在 C 语言中逗号还是一种特殊的运算符也就是逗号运算符能 用它将两个或多个表达式连接起来形成逗号表达式逗号表达式的一般形式为

表达式 1表达式 2表达式 3表达式 n

这样用逗号运算符组成的表达式在程序运行时是从左接计算出各个表达式的值而 整个用逗号运算符组成的表达式的值等于最右边表达式的值就是表达式 n的值在实 实应用中大部分情况下使用逗号表达式的目的只是为了直得到名个表达式的值而 并不一定要得到和使用整个逗号表达式的值要注意的还有并不是在程序的任何位置出现 的逗号都能认为是逗号运算符如函数中的参数同类型变量的定义中的逗号只是用来 间隔之用而不是逗号运算符


条件运算符

上面我们说过单片机C语言中有一个三目运算符它就是?:条件运算符它要求有三个运算对象它能把三个表达式连接构成一个条件表达式条件表达式的一般形式如下:

逻辑表达式?  表达式 1  :  表达式 2 条件运算符的作用简单来说就是根据逻辑表达式的值选择使用表达式的值当逻辑表达

式的值为真时非 0 值时整个表达式的值为表达式 1 的值当逻辑表达式的值为假值

为 0时整个表达式的值为表达式 2 的值要注意的是条件表达式新辑表达式的类型可 以与表达式 1 和表达式 2 的类型不一样下面是一个逻辑表达式的例子

如有 a=1,b=2 这个时候我们要求是取 ab 两数中的较小的值放入 min 变量中也许你会这样 写

if  (a<b)

min  =  a;

else

min  =  b;  //这一段的意思是当 a<b 时 min 的值为 a 的值不然为 b 的值

用条件运算符去构成条件表达式就变得简单明了了

min  =  (a<b)a  :  b 很明运的结果和含意都和上面的一段程序是一样的但是代码却比上一段程序少很多编译的效率也相对要高但有着和复合赋值表达式一样的缺点就是可读性相对效差在实际应 用时根据自己要习惯使用就我自己来说我不使用较为好读的方式和加上实的注解这 样能有助于程序的调试和编写也便于日后的修改读础

发表评论告诉好友收藏此文关闭窗口

文章评论

Ƶ