單片機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 逗 號 逗號運算 , 右結合
1.算術運算符
用于各類數值運算。包括加(+)、減(-)、乘(*)、除(/)、求余(或稱模運算,%)、自增(++)、自減(--)共七種。
2.關系運算符
用于比較運算。包括大于(>)、小于(<)、等于(==)、大于等于(>=)、小于等于(<=)和不等于(!=)六種。
3.邏輯運算符
用于邏輯運算。包括與(&&)、或(||)、非(!)三種。
4.位操作運算符
參與運算的量,按二進制位進行運算。包括位與(&)、位或(|)、位非(~)、位異或(^)、左移(<<)、右移(>>)六種。
5.賦值運算符
用于賦值運算,分為簡單賦值(=)、復合算術賦值(+=,-=,*=,/=,%=)和復合位運算賦值(&=,|=,^=,>>=,<<=)三類共十一種。
6.條件運算符
這是一個三目運算符,用于條件求值(?:)。
7.逗號運算符
用于把若干表達式組合成一個表達式(,)。
8.指針運算符
用于取內容(*)和取地址(&)二種運算。
9.求字節數運算符
用于計算數據類型所占的字節數(sizeof)。
10.特殊運算符
有括號(),下標[],成員(→,.)等幾種。
優先級和結合性
c語言中,運算符的運算優先級共分為15級。1級最高,15級最低。在表達式中,優先級較高的先于優先級較低的進行運算。而在一個運算量兩側的運算符優先級相同時,則按運算符的結合性所規定的結合方向處理。 c語言中各運算符的結合性分為兩種,即左結合性(自左至右)和右結合性(自右至左)。例如算術運算符的結合性是自左至右,即先左后右。如有表達式x-y+z則y應先與“-”號結合,執行x-y運算,然后再
執行+z的運算。這種自左至右的結合方向就稱為“左結合性”。而自右至左的結合方向稱為“右結合性”。最典型的右結合性運算符是賦值運算符。如x=y=z,由于“=”的右結合性,應先執行y=z再執行x=(y=z)運算。 c語言運算符中有不少為右結合性,應注意區別,以避免理解錯誤。
算術運算符和算術表達式基本的算術運算符
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--);
pri
ntf(\"%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。算術表達式表達式是由常量、變量、函數和運算符組合起來的式子。一個表達式有一個值及其類型,它們等于計算表達式所得結果的值和類型。表達式求值按運算符的優先級和結合性規定的順序進行。單個的常量、變量、函數可以看作是表達式的特例。
|