單片機(jī)c語言教程:運(yùn)算符和表達(dá)式(關(guān)系運(yùn)算符)
關(guān)系運(yùn)算符,同樣我們也并不陌生。單片機(jī)C語言中有六種關(guān)系運(yùn)算符,這些東西同樣是在我們小時候?qū)W算術(shù)時就已經(jīng)學(xué)習(xí)過了的:
> 大于
< 小于
>= 大于等于
<= 小于等于
== 等于
?。?nbsp; 等于
或者你是個非 C語言 程序員,那么對前四個一定是再熟悉不過的了。而“==”在 VB 或 PASCAL 等中是用“=”,“!=”則是用“not ”。
小學(xué)時的數(shù)學(xué)課就教授過運(yùn)算符是有優(yōu)先級別的,計(jì)算機(jī)的語言也不過是人類語言的一種擴(kuò)展,這里的運(yùn)算符同樣有著優(yōu)先級別。前四個具有相同的優(yōu)先級,后兩個也具有相同的優(yōu)先級,但是前四個的優(yōu)先級要高于后2個的。
當(dāng)兩個表達(dá)式用關(guān)系運(yùn)算符連接起來時,這個時候就是關(guān)系表達(dá)式。關(guān)系表達(dá)式通常是用來判別某個條件是否滿足。要注意的是用關(guān)系運(yùn)算符的運(yùn)算結(jié)果只有 0 和 1 兩種,也就是邏輯的真與假,當(dāng)指定的條件滿足時結(jié)果為 1,不滿足時結(jié)果為 0。
表達(dá)式 1 關(guān)系運(yùn)算符 表達(dá)式 2 如:I<J,I==J,(I=4)>(J=3),J+I>J
借助我們在上一課做好的電路和學(xué)習(xí)了的相關(guān)操作。我們來做一個關(guān)系運(yùn)算符相關(guān)的實(shí)例程序。為了增加學(xué)習(xí)的趣味性和生動性,不妨我們來假設(shè)在做一個會做算術(shù)的機(jī)器人,當(dāng)然真正會思考對話的機(jī)器,我想我是做不出來的了,這里的程序只是用來學(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; //定時器 1 定時方式 2
TH1 = 0xE8; //11.0592MHz 1200 波特率 TL1 = 0xE8;
TI = 1;
TR1 = 1; //啟動定時器
while(1)
{
printf("您好!我叫 Robot!我是一個會做算術(shù)的機(jī)器人!n"); //顯示
printf("請您輸入兩個 int,X 和 Yn"); //顯示
scanf("%d%d",&x,&y); //輸入
if (x < y)
printf("X<Yn"); //當(dāng) X 小于 Y 時
else //當(dāng) X 不小于 Y 時再作判斷
{
if (x == y)
printf("X=Yn"); //當(dāng) X 等于 Y 時
else
printf("X>Yn"); //當(dāng) X 大于 Y 時
}
}
}
要注意的是,在連接 PC 串行口調(diào)試時。發(fā)送數(shù)字時,發(fā)送完一個數(shù)字后還要發(fā)送一個回車符,以使 scanf 函數(shù)確認(rèn)有數(shù)據(jù)輸入。
邏輯運(yùn)算符 關(guān)系運(yùn)算符所能反映的是兩個表達(dá)式之間的大小等于關(guān)系,那邏輯運(yùn)算符則是用于求條
件式的邏輯值,用邏輯運(yùn)算符將關(guān)系表達(dá)式或邏輯量連接起來就是邏輯表達(dá)式了。也許你會 對為什么“邏輯運(yùn)算符將關(guān)系表達(dá)式連接起來就是邏輯表達(dá)式了”這一個描述有疑惑的地方。 其實(shí)之前說過“要注意的是用關(guān)系運(yùn)算符的運(yùn)算結(jié)果只有 0 和 1 兩種,也就是邏輯的真與假”, 換句話說也就是邏輯量,而邏輯運(yùn)算符就用于對邏輯量運(yùn)算的表達(dá)。邏輯表達(dá)式的一般形式 為:
邏輯與:條件式 1 && 條件式 2 邏輯或:條件式 1 || 條件式 2 邏輯非: ! 條件式 2
圖 7-1 演示結(jié)果
邏輯與,說白了就是當(dāng)條件式 1“與”條件式 2 都為真時結(jié)果為真(非 0 值),不然為 假(0 值)。也就是說運(yùn)算會先對條件式 1 進(jìn)行判斷,如果為真(非 0 值),則繼續(xù)對條件式
2 進(jìn)行判斷,當(dāng)結(jié)果為真時,邏輯運(yùn)算的結(jié)果為真(值為 1),如果結(jié)果不為真時,邏輯運(yùn)算 的結(jié)果為假(0 值)。如果在判斷條件式 1 時就不為真的話,就不用再判斷條件式 2 了,而 直接給出運(yùn)算結(jié)果為假。
邏輯或,是指只要二個運(yùn)算條件中有一個為真時,運(yùn)算結(jié)果就為真,只有當(dāng)條件式都不 為真時,邏輯運(yùn)算結(jié)果才為假。
邏輯非則是把邏輯運(yùn)算結(jié)果值取反,也就是說如果兩個條件式的運(yùn)算值為真,進(jìn)行邏輯 非運(yùn)算后則結(jié)果變?yōu)榧?,條件式運(yùn)算值為假時最后邏輯結(jié)果為真。
同樣邏輯運(yùn)算符也有優(yōu)先級別,!(邏輯非)→&&(邏輯與)→||(邏輯或),邏輯非的 優(yōu)先值最高。
如有 !True || False && True
按邏輯運(yùn)算的優(yōu)先級別來分析則得到(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 |
下面我們來用程序語言去有表達(dá),如下:
#include <AT89X51.H>
#include <stdio.h>
void main(void)
{
unsigned char True = 1; //定義
unsigned char False = 0;
SCON = 0x50; //串行口方式 1,允許接收 TMOD = 0x20; //定時器 1 定時方式 2
TH1 = 0xE8; //11.0592MHz 1200 波特率 TL1 = 0xE8;
TI = 1;
TR1 = 1; //啟動定時器
if (!True || False && True)
printf("Truen"); //當(dāng)結(jié)果為真時
else
}
printf("Falsen"); //結(jié)果為假時
大家能使用以往學(xué)習(xí)的方法用 keil 或燒到片子上用串行口調(diào)試。能更改“!True || False
&& True”這個條件式,以實(shí)驗(yàn)不一樣算法組合來掌握邏輯運(yùn)算符的使用方法。