51單片機(jī)之C語(yǔ)言-4.4運(yùn)算符及表達(dá)式
前面三節(jié)實(shí)際是講如何定義一個(gè)數(shù)據(jù)類(lèi)型,所謂數(shù)據(jù)類(lèi)型其實(shí)就是不同存儲(chǔ)空間的形狀,也就是不同單元格的組合方式。既然定義了數(shù)據(jù)類(lèi)型,我們的目的當(dāng)然是如何使用它們,比如賦值,比較大小,移位變化,等待。簡(jiǎn)單的講就是”誰(shuí)”-數(shù)據(jù)類(lèi)型, “怎么樣”-如何運(yùn)算。往我們定義的單元格中填充內(nèi)容。既然要運(yùn)算當(dāng)然有配套的運(yùn)算符和表達(dá)式,現(xiàn)在將各種運(yùn)算符及表達(dá)式總結(jié)如表4-4-1所示。
本文引用地址:http://m.butianyuan.cn/article/201611/319553.htm這里我們選取幾個(gè)在單片機(jī)編程中比較常見(jiàn)的運(yùn)算符進(jìn)行講解。
(1) 自增運(yùn)算和自減運(yùn)算
對(duì)于運(yùn)算符相信大家非常熟悉,這里不細(xì)講。值得提醒一下的是,自增和自減運(yùn)算符,
++a:a的值先增加1后,再參與其他運(yùn)算
a++: a的值先參與其他運(yùn)算,再使a的值增加1
--a: a的值先減小1后,再參與其他運(yùn)算
a--: a的值先參與其他運(yùn)算,再使a的值減小1
這里我們舉一個(gè)例子:
a = 1;
b = 0;
a = ++b;
與
a = 1;
b = 0;
a = b++;
現(xiàn)在我們?cè)赩S2013中驗(yàn)證一下輸出結(jié)果,
#include
void main(void)
{
int a, b;
a = 1;
b = 0;
b = a++;
printf("a=%dnb=%dn",a,b);//輸出結(jié)果a=2,b=1
a = 1;
b = 0;
b = ++a;
printf("a=%dnb=%dn",a,b);//輸出結(jié)果a=2,b=2
system("pause");
}
(2)賦值運(yùn)算
賦值運(yùn)算符很好理解,需要注意的是書(shū)寫(xiě)形式,比如
a = a + 1;
很多情況下我們看到的表達(dá)式是把運(yùn)算符”+”放到”=”前面,然后把第二個(gè)a去掉
a += 1;
(3)關(guān)系運(yùn)算符
在關(guān)系運(yùn)算符中,在比較a與b是否相等的時(shí)候,使用a==b,這里容易漏掉一個(gè)等號(hào)
而a=b表示把b的值賦給a
(4)邏輯運(yùn)算
參加邏輯運(yùn)算的對(duì)象,用”0”表示假,用”非0”表示真.
邏輯運(yùn)算的運(yùn)算規(guī)則可見(jiàn)的歸納為:
邏輯與-同真為真,邏輯或同假為假,邏輯非遇假變真,遇真變假
(5)位運(yùn)算
左移的規(guī)則是將二進(jìn)制數(shù)向左移動(dòng)若干位,左邊移走的高位被丟棄,右邊被空出來(lái)的低位補(bǔ)零。
右移的規(guī)則是將二進(jìn)制數(shù)向右移若干位,右移與被移動(dòng)的數(shù)據(jù)是否帶符號(hào)有關(guān)。對(duì)于無(wú)符號(hào)整數(shù)來(lái)講,左端空出的高位全部補(bǔ)0.
這里我們不討論帶符號(hào)的位移
例4-4-1 通過(guò)位移的方法創(chuàng)建流水燈
#include "reg52.h"
typedef unsigned char uchar;
void delayUs(uchar t);
void delayMs(uchar t);
void main(void)
{
uchar LED=0X80;//10000000
uchar i;
while(1)
{
for (i=0;i<8;i++)
{
P1= ~LED;//按位非
LED>>=1;
delayMs(100);
}
LED=0X80;
}
}
void delayUs(uchar t)
{
while(--t);
}
void delayMs(uchar t)
{
while(--t)
{
delayUs(245);
delayUs(245);
}
}
(6)逗號(hào)和條件運(yùn)算符
逗號(hào)運(yùn)算符是所有運(yùn)算符中優(yōu)先級(jí)最低的,運(yùn)算的結(jié)果值是最后一個(gè)表達(dá)式的值。例如:
int a,b,c,d;
d=(a=1,b=a+2,c=b+3);
printf("d=%dn",d)
那么以上輸出的結(jié)果為6.在很多情況下,使用逗號(hào)表達(dá)式的目的只是想分別得到各個(gè)表達(dá)式的值,而并非一定需要得到和使用整個(gè)逗號(hào)表達(dá)式的值,逗號(hào)表達(dá)式最常用與循環(huán)語(yǔ)句(for語(yǔ)句)中。
例如:
for(s=0,i=1;i<=100;s+=i,i++)
條件表達(dá)式的一般形式為:
表達(dá)式1 ?表達(dá)式2 :表達(dá)式3
條件表達(dá)式中含有三個(gè)操作對(duì)象,它們都是表達(dá)式。一般,表達(dá)式1是關(guān)系表達(dá)式或邏輯表達(dá)式,用于描述條件表達(dá)式中的條件,根據(jù)條件的真假判斷是進(jìn)行表達(dá)式2的運(yùn)算還是進(jìn)行表達(dá)式3的運(yùn)算。表達(dá)式2和表達(dá)式3可以是常量,變量或表達(dá)式如算術(shù)表達(dá)式,關(guān)系表達(dá)式,賦值表達(dá)式和邏輯表達(dá)式等。
一般情況下,條件表達(dá)式與結(jié)構(gòu)程序設(shè)計(jì)中的if語(yǔ)句可以進(jìn)行相互替換。
例如:
max = (a>b) ? a : b
用if語(yǔ)句表示為:
if (a>b)
{
max=a;
}
else
{
max=b;
}
但不是所有的條件語(yǔ)句都能替換,比如
if (a>b)
{
printf("%d",a);
}
else
{
printf("%d",b);
}
這里不能使用以下語(yǔ)句替換,
a>b?printf("%d",a) : printf("%d",b);
為什么?因?yàn)闂l件表達(dá)式的結(jié)果是一個(gè)值,要將這個(gè)值賦給一個(gè)變量或以一個(gè)值的形式輸出,而上面的形式表示的是,如果a>b為真,就將a以整型的形式輸出,否則將b以整型的形式輸出,而在實(shí)際編程過(guò)程中無(wú)法將其值輸出。
評(píng)論