專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> 基礎(chǔ)教程 >> 瀏覽文章

第七課 運(yùn)算符和表達(dá)式(關(guān)系運(yùn)算符)

作者:佚名   來(lái)源:本站原創(chuàng)   點(diǎn)擊數(shù):  更新時(shí)間:2007年07月17日   【字體:

關(guān)系運(yùn)算符,同樣我們也并不陌生。單片機(jī)C語(yǔ)言中有六種關(guān)系運(yùn)算符,這些東西同樣是在我們小時(shí)候?qū)W算術(shù)時(shí)就已經(jīng)學(xué)習(xí)過(guò)了的:

>           大于

<           小于

>=       大于等于

<=       小于等于

==       等于

!=       等于

或者你是個(gè)非 C語(yǔ)言 程序員,那么對(duì)前四個(gè)一定是再熟悉不過(guò)的了。而“==”在 VB 或 PASCAL 等中是用“=”,“!=”則是用“not  ”。

小學(xué)時(shí)的數(shù)學(xué)課就教授過(guò)運(yùn)算符是有優(yōu)先級(jí)別的,計(jì)算機(jī)的語(yǔ)言也不過(guò)是人類語(yǔ)言的一種擴(kuò)展,這里的運(yùn)算符同樣有著優(yōu)先級(jí)別。前四個(gè)具有相同的優(yōu)先級(jí),后兩個(gè)也具有相同的優(yōu)先級(jí),但是前四個(gè)的優(yōu)先級(jí)要高于后2個(gè)的。

當(dāng)兩個(gè)表達(dá)式用關(guān)系運(yùn)算符連接起來(lái)時(shí),這個(gè)時(shí)候就是關(guān)系表達(dá)式。關(guān)系表達(dá)式通常是用來(lái)判別某個(gè)條件是否滿足。要注意的是用關(guān)系運(yùn)算符的運(yùn)算結(jié)果只有 0 和 1 兩種,也就是邏輯的真與假,當(dāng)指定的條件滿足時(shí)結(jié)果為 1,不滿足時(shí)結(jié)果為 0。

表達(dá)式 1    關(guān)系運(yùn)算符    表達(dá)式 2 如:I<J,I==J,(I=4)>(J=3),J+I>J

借助我們?cè)谏弦徽n做好的電路和學(xué)習(xí)了的相關(guān)操作。我們來(lái)做一個(gè)關(guān)系運(yùn)算符相關(guān)的實(shí)例程序。為了增加學(xué)習(xí)的趣味性和生動(dòng)性,不妨我們來(lái)假設(shè)在做一個(gè)會(huì)做算術(shù)的機(jī)器人,當(dāng)然真正會(huì)思考對(duì)話的機(jī)器,我想我是做不出來(lái)的了,這里的程序只是用來(lái)學(xué)習(xí)關(guān)系運(yùn)算符的基本應(yīng)用。

#include  <AT89X51.H>

#include  <stdio.h>

void  main(void)

{

int  x,y;

SCON  =  0x50;  //串行口方式 1,允許接收 TMOD  =  0x20;  //定時(shí)器 1 定時(shí)方式 2

TH1  =  0xE8;  //11.0592MHz  1200 波特率 TL1  =  0xE8;

TI  =  1;

TR1  =  1;  //啟動(dòng)定時(shí)器

while(1)

{

printf("您好!我叫 Robot!我是一個(gè)會(huì)做算術(shù)的機(jī)器人!\n");  //顯示

printf("請(qǐng)您輸入兩個(gè) int,X  和  Y\n");  //顯示


scanf("%d%d",&x,&y);       //輸入

if  (x  <  y)

printf("X<Y\n");  //當(dāng) X 小于 Y 時(shí)

else       //當(dāng) X 不小于 Y 時(shí)再作判斷

{

if  (x  ==  y)

printf("X=Y\n");  //當(dāng) X 等于 Y 時(shí)

else

printf("X>Y\n");  //當(dāng) X 大于 Y 時(shí)

}

}

}

要注意的是,在連接 PC 串行口調(diào)試時(shí)。發(fā)送數(shù)字時(shí),發(fā)送完一個(gè)數(shù)字后還要發(fā)送一個(gè)回

車符,以使 scanf 函數(shù)確認(rèn)有數(shù)據(jù)輸入。

邏輯運(yùn)算符 關(guān)系運(yùn)算符所能反映的是兩個(gè)表達(dá)式之間的大小等于關(guān)系,那邏輯運(yùn)算符則是用于求條

件式的邏輯值,用邏輯運(yùn)算符將關(guān)系表達(dá)式或邏輯量連接起來(lái)就是邏輯表達(dá)式了。也許你會(huì) 對(duì)為什么“邏輯運(yùn)算符將關(guān)系表達(dá)式連接起來(lái)就是邏輯表達(dá)式了”這一個(gè)描述有疑惑的地方。 其實(shí)之前說(shuō)過(guò)“要注意的是用關(guān)系運(yùn)算符的運(yùn)算結(jié)果只有 0 和 1 兩種,也就是邏輯的真與假”, 換句話說(shuō)也就是邏輯量,而邏輯運(yùn)算符就用于對(duì)邏輯量運(yùn)算的表達(dá)。邏輯表達(dá)式的一般形式 為:

邏輯與:條件式 1  &&  條件式 2 邏輯或:條件式 1  ||  條件式 2 邏輯非:  !  條件式 2


圖 7-1    演示結(jié)果

邏輯與,說(shuō)白了就是當(dāng)條件式 1“與”條件式 2 都為真時(shí)結(jié)果為真(非 0 值),不然為 假(0 值)。也就是說(shuō)運(yùn)算會(huì)先對(duì)條件式 1 進(jìn)行判斷,如果為真(非 0 值),則繼續(xù)對(duì)條件式

2 進(jìn)行判斷,當(dāng)結(jié)果為真時(shí),邏輯運(yùn)算的結(jié)果為真(值為 1),如果結(jié)果不為真時(shí),邏輯運(yùn)算 的結(jié)果為假(0 值)。如果在判斷條件式 1 時(shí)就不為真的話,就不用再判斷條件式 2 了,而 直接給出運(yùn)算結(jié)果為假。

邏輯或,是指只要二個(gè)運(yùn)算條件中有一個(gè)為真時(shí),運(yùn)算結(jié)果就為真,只有當(dāng)條件式都不 為真時(shí),邏輯運(yùn)算結(jié)果才為假。

邏輯非則是把邏輯運(yùn)算結(jié)果值取反,也就是說(shuō)如果兩個(gè)條件式的運(yùn)算值為真,進(jìn)行邏輯 非運(yùn)算后則結(jié)果變?yōu)榧,條件式運(yùn)算值為假時(shí)最后邏輯結(jié)果為真。

同樣邏輯運(yùn)算符也有優(yōu)先級(jí)別,!(邏輯非)→&&(邏輯與)→||(邏輯或),邏輯非的 優(yōu)先值最高。

如有    !True  ||  False  &&  True

按邏輯運(yùn)算的優(yōu)先級(jí)別來(lái)分析則得到(True 代表真,F(xiàn)alse 代表假)

!True  ||

False

&&

True

 

False  ||

False

&&

True

//!Ture 先運(yùn)算得 False

False  ||

False

   

//False  &&  True 運(yùn)算得 False

False

     

//最終 False  ||  False 得 False

下面我們來(lái)用程序語(yǔ)言去有表達(dá),如下:

#include  <AT89X51.H>

#include  <stdio.h>

void  main(void)

{

unsigned  char  True  =  1;  //定義

unsigned  char  False  =  0;

SCON  =  0x50;  //串行口方式 1,允許接收 TMOD  =  0x20;  //定時(shí)器 1 定時(shí)方式 2

TH1  =  0xE8;  //11.0592MHz  1200 波特率 TL1  =  0xE8;

TI  =  1;

TR1  =  1;  //啟動(dòng)定時(shí)器

if  (!True  ||  False  &&  True)

printf("True\n");  //當(dāng)結(jié)果為真時(shí)


else

}

printf("False\n");  //結(jié)果為假時(shí)

大家能使用以往學(xué)習(xí)的方法用 keil 或燒到片子上用串行口調(diào)試。能更改“!True || False

&&  True”這個(gè)條件式,以實(shí)驗(yàn)不一樣算法組合來(lái)掌握邏輯運(yùn)算符的使用方法。

關(guān)閉窗口