第3章 C 語言的基本知識
μ’nSP™ GCC 的基本資料類型 資 料 類 型 資料長度(位元數) 表示範圍 char 16 -32768~32767 short 資 料 類 型 資料長度(位元數) 表示範圍 char 16 -32768~32767 short int long int 32 -2147483648~2147483647 unsigned char 0~65535 unsigned short unsigned int unsigned long int 0~4294967295 float 以 IEEE 格式表示的 32 位浮點數 double
μ’nSP™ GCC基本的算術運算符號 運 算 子 作 用 +、-、*、/、% 加、減、乘、除、餘數運算 &&、|| 邏輯AND、OR 作 用 +、-、*、/、% 加、減、乘、除、餘數運算 &&、|| 邏輯AND、OR &、|、^、<<、>> 位元運算AND、OR、XOR、左移、右移 >,>=,<,<=,= =,!= 大於、不小於、小於、不大於、等於、不等於 = 指定運算 ? : 條件運算 , 逗號運算 *、& 指標運算 . 分量運算 sizeof 資料位元組數運算 [ ] 陣列指標運算
鍵盤掃描原理圖
使用位元檢測鍵盤值的變化 IOA7 IOA6 IOA5 IOA4 IOA3 IOA2 IOA1 IOA0 原鍵值(old) 0 0 1 0 0 0 1 0 1 1 0 1 新鍵值(new) 0 1 0 0 1 1 1 0 中間變數(temp=old^ new) 0 1 1 0 0 0 1 1 新按鍵(temp&new) 0 0 0 1 釋放鍵(temp&old)
鍵盤掃描的程式 請注意單一“=”和 雙等號“==”的區別,“==”號將只對等式進行測試,而不進行任何指定運算。 ********************************************************************* unsigned int old,new,push,rel,temp,row; void key(void) { for(row=0x10;row<0x100;row<<1) //掃描 *P_IOA_Data=*P_IOA_Data&row; new=(new<<4)| *P_IOA_Data&0x0f; //讀回列信息 } if ( (temp = new^old) >0) /獲取按下和釋放的鍵值資訊 push=temp&new; rel=temp&old; old=new; *********************************************************** 請注意單一“=”和 雙等號“==”的區別,“==”號將只對等式進行測試,而不進行任何指定運算。
順序結構流程圖
選擇結構流程圖
C語言的 if 敘述有三種基本形式 第一種形式為基本形式 第二種形式為 if-else 形式 if(運算式) 敘述; 其語義是:如果運算式的值為真,則執行其後的敘述,否則不執行該敘述。 第二種形式為 if-else 形式 if(運算式) 敘述 1; else 敘述 2; 其語義是:如果運算式的值為真,則執行敘述 1,否則執行敘述 2。
C語言的 if 敘述有三種基本形式 第三種形式為 if-else-if 形式 敘述 1; else if(運算式2) 敘述 2; …… else if(運算式 n) 敘述 n; else 敘述 n+1; 其語義是:依次判斷運算式的值,當出現某個值為真時,則執行其對應的敘述。然後跳到整個 if 敘述之外繼續執行程式。如果所有的運算式均為假,則執行敘述 n。然後繼續執行後續程式。
switch 敘述的一般形式 switch(運算式) { case 常量運算式 1:敘述 1;break; … case 常量運算式 n:敘述 n;break; default :敘述 n+1; } 說明: 每個 case 後的值只能是純量組成的運算式,當 switch 後的運算式的值與某一個常量運算式的值一致時。程式就轉到此 case 後的敘述開始執行,然後遇 break 就退出 switch 敘述。如果沒有一個值與 switch 後的值一致,就執行 default 後的敘述。 各個 case 和 default 出現的次序不影響執行結果,一般情況下,儘量使用出現機率大的 case 放在前面。
迴圈結構流程圖
while 敘述 while 敘述的語義是:計算運算式的值,當值為真(非 0)時,執行迴圈主體敘述。使用 while 敘述應注意以下幾點: 迴圈主體如包括有一個以上的敘述,則必須用{}括起來,組成複合敘述。 應注意迴圈條件的選擇以避免無窮迴圈。
do-while 敘述 do-while 敘述的一般形式為: do 敘述; while(運算式); 其中敘述是迴圈主體,運算式是迴圈條件。 do-while 敘述的特點是在判斷條件是否成立前,先執行迴圈敘述一次。這是與while敘述的一個基本性的區別。
for 敘述 for 敘述的作用是用來表示迴圈次數已知的情況,它的使用格式為: for(運算式一;運算式二;運算式三) 迴圈主體敘述 它的執行過程如下: 1>先求解運算式一。 2>求解運算式二,若其值為 0 則結束迴圈;若其值為非 0 則執行下面的第三步。 3>執行迴圈主體敘述,這個敘述代表一條敘述或一個複合敘述。 4>求解運算式三。 5>轉到第二步去執行。
陣列 一維陣列的定義 型別 陣列名稱[常量運算式]; 例如: int b1[5];表示定義了一個含有5個整數元素、名稱為 b1 的一維陣列。 型別 陣列名稱[常量運算式]; 例如: int b1[5];表示定義了一個含有5個整數元素、名稱為 b1 的一維陣列。 float x[10];定義了一個含有10個單精確度浮點元素、名稱為 x 的一維陣列。
指標 μ’nSPTM GCC 編譯器所認可的指標是16位元的,這點大家撰寫程式時要注意。 指標變數的類型說明 其一般形式為: 型別 *變數名; 其中,*表示這是一個指標變數,變數名即為定義的指標變數名,表示本指標變數所指向的變數的資料類型。
指標變數的設定運算 指標變數初始化定義 把一個變數的位址指向相同資料類型的指標變數 把一個指標變數的值指向相同類型變數的另一個指標變數 int a; int *p=&a; /*把整數變數a的位址設給 p*/ 把一個變數的位址指向相同資料類型的指標變數 int a,*pa; pa=&a; /*把整數變數a的位址給予整數指標變數 pa*/ 把一個指標變數的值指向相同類型變數的另一個指標變數 int a,*pa,*pb; pa=&a; pb=pa; /*把 a 的位址給予指標變數 pb*/ 由於 pa,pb 均為指向整型變數的指標變數,因此可以相互給值。 把陣列的起始位址指向陣列的指標變數 int a[5],*pa; pa=a; (陣列名稱表示陣列的起始位址,故可指向陣列的指標變數 pa) 把字串的起始位址指向字元類型的指標變數 char *pc=“C Language”; 這裏應說明的是並不是把整個字串裝入指標變數,而是把存放該字串的字元陣列的起始位址移入指標變數。 把函數的呼叫位址指向函數的指標變數 int (*pf)();pf=f; /*f 為函數名*/
定義結構的類型 定義一個結構的一般形式為: struct 結構名 { 成員表列 }; 成員表由若干個成員組成,每個成員都是該結構的一個組成部分。對每個成員也必須作類型說明。 struct date { unsigned int month; unsigned int day; unsigned int year; };
定義結構類型變數 先定義結構,再說明結構變數。如: struct date { unsigned int month; unsigned int day; unsigned int year; }; date date1,date2; 說明了兩個變數 date 1 和 date 2 為date結構類型。如果結構變數是總體變數或為靜態變數,則可對它作初始化設定。對局部或自動結構變數不能作初始化設定。
結構指標變數 結構指標變數中的值是所指向的結構變數的起始位址。透過結構指標即可連結該結構變量,這與陣列指標和函數指標的情況是相同的。 結構指標變數說明的一般形式為: struct 結構名 *結構指標變數名; 例如,在前面定義了 date 這個結構,如要說明一個指向 date 的指標變數 pdate,可寫為:struct date *pdate;
結構類型變數的使用 我們對結構進行使用時,我們只能對結構體的成員進行設定、存取和運算。其連結的一般形式為: (*結構指標變數).成員名 或為:結構指標變數->成員名。 例如: (*pdate).month 或者: pdate ->month 應該注意(*pdate)兩側的括弧不可少,因為成員“.”的優先順序高於“*”。如去掉括弧寫作*pdate.month 則等效於*(pdate.month),這樣,意義就完全不對了。
函數的定義形式 型別 函數名(形式參數表列) 形式參數類型說明: {變數定義部分函數體敘述}
形式參數與實際參數 在C語言的程式中,大部分函數都是帶參數函數。所以在呼叫函數與定義函數時存在著資料傳遞。 在定義函數時函數名後括弧內的變數就稱為形式參數。而在呼叫函數時函數名後括弧內的變數被稱為實際參數。
參數傳遞的堆疊呼叫