790 likes | 885 Views
outline. 安裝環境 Hello world Data type Printf & scanf 運算子 條件運算式 loop Break , continue , goto Function Pointer Struct stack. http://download.eclipse.org/tools/cdt/releases/galileo. #include < stdio.h >
E N D
outline • 安裝環境 • Hello world • Data type • Printf & scanf • 運算子 • 條件運算式 • loop • Break , continue , goto • Function • Pointer • Struct • stack
#include <stdio.h> 這一條並非C語言的命令,而是屬於C語言前置處理程式(preprocessor)所管理的指令(Directive),#define也是這類指令。簡單地說,這條假指令的目的就是於該處引進(include)檔案stdio.h的全部內容,其結果正如同我們於該處鍵入stdio.h檔案內容一般。 檔案stdio.h乃系統所附的檔案,這類檔案泛稱為標頭檔(Header file),由其附加檔案.h即可看出它的意義。
stdio.h的實際意義為標準輸入輸出標頭檔,檔案中定義了許多重要的常數(Constant)以及函式原型宣告(Function prototype declaration)或語法(Syntax)的宣告,譬如程式中使用到的printf( )函式的語法,是放在stdio.h的標頭檔裏,而system()庫存函式的語法則放在stdlib.h標頭檔中。
函式scanf() • printf()函式主要功能是作為輸出之用,而相對應的輸入函式則為scanf(),它的參數型態與printf()差不多。 scanf(format,item1,item2,....,itemN); • format仍然是一個控制字串,其中還是由%和轉換字元組合而成,後面的每一項資料都要與前面的轉換規格吻合。
和printf()間最重要的一點差異是scanf()中的資料項都必須是變數的位址;目前我們所知的作法就是在單純變數前加入&運算子。請看底下的範例:和printf()間最重要的一點差異是scanf()中的資料項都必須是變數的位址;目前我們所知的作法就是在單純變數前加入&運算子。請看底下的範例: int num; 我們宣告了int型態的變數num,若想由鍵盤讀入num的數值,就該這麼做: scanf("%d", &num);
單引號內的%d意謂著程式將等待一個十進位整數的輸入,至於輸入的資料則放在&num這個位址上,從此之後,變數便擁有剛剛輸入的數值。千萬別寫成單引號內的%d意謂著程式將等待一個十進位整數的輸入,至於輸入的資料則放在&num這個位址上,從此之後,變數便擁有剛剛輸入的數值。千萬別寫成 scanf("%d", num); 這是初學者常犯的錯誤。 • scanf()的控制字串與printf()十分類似,都允許具有選擇性的欄位。
算術運算子 表4-1 算術運算子
餘數運算子 • 餘數運算子(modular operator)的表示記號為'%',同樣是二元運算子: a % b • 該運算子可取得a除以b後所留下的餘數,特別注意的是:本運算子僅能作用於整數型態;換句話說,a和b這兩個運算元都必須是整數資料。
遞增與遞減運算子 • 遞增運算子可依運算子的位置不同而有兩種形式:第一種是++出現於運算元前面,即所謂的“前置”(prefix)模式;另一種則為++位於運算元之後,即“後繼”(postfix)模式。 ++num; 前置模式 num++; 後繼模式
7 6 5 4 3 2 1 0 位元運算子 • C語言共擁有四種位元運算子(bitwise operator):~(NOT), &(AND),|(OR),以及^(XOR),它們均運作於整數型態的資料上。另外還有兩個位移運算子(shift operator):<<(左移)與>>(右移),它們能將位元內容分別向左或向右遞移指定的次數。 • 當我們說位元0時即代表最右邊的低次位元,而位元7則為最左方的高次位元
if敘述與關係運算子 • if敘述又稱為“分支敘述 (branching statement)” • if後面至少有個小括號,小括號裡面乃為一般的運算式,譬如(a>b)(a大於b)或是(x == y)(x等於y)等等。
關係運算子便可組成關係運算式。C語言共提供六種關係運算子,它們都是二元運算子關係運算子便可組成關係運算式。C語言共提供六種關係運算子,它們都是二元運算子 表 5-1 關係運算子 28
If & else if & else 執行情形 What's your score ? 114 It's impossible ! What's your score ? 91 Score 91 ===> A What's your score ? 14 You are down ! 29
while迴圈 • while迴圈的工作原理: • 首先對expression運算式加以求值,若結果為真(即非零值),那麼statement部分便會執行;一旦執行完畢後,控制權又回到expression測試 • 這種過程一直持續到expression的求值結果變成假(即0)為止,然後才結束while敘述。 • 在邏輯上,整個while迴圈乃為單一敘述。
do....while迴圈 • 首先執行statement敘述(不論是單一的或是複合的),然後再對expression進行求值,如果為假,迴圈敘述便就此結束,否則還要回到statement繼續執行:
整個do....while同樣被視為單一敘述,別忘記while (expression)後面的分號。在迴圈本體中,應該要有某些敘述可使最後的測試條件變為假,否則就會陷入"無窮迴圈"(infinite loop)的狀況。
for迴圈 • initial:此敘述僅在第一次進入迴圈時執行一次,往後便不再執行。 • test:即一般的測試運算式,在進入迴圈本體前,test敘述將先行求值;若求值結果為假,就立即跳出for迴圈;否則便執行statement敘述(單一或是複合)。
update:凡是執行完statement本體敘述後,update敘述將接著執行,以改變某些測試條件。然後再回到test測試,重複同樣的循環。update:凡是執行完statement本體敘述後,update敘述將接著執行,以改變某些測試條件。然後再回到test測試,重複同樣的循環。 • 這三個敘述分別可以省略,也可以有多個敘述,若省略initial或test,其後面的「;」還是要寫出來。 • for迴圈的示意圖如下:
逗號運算子 • 逗號(,)除了在變數宣告時用來分隔同類型的變數名稱外,它本身還是一種運算子,稱作逗號運算子(comma operator)。 • 多於一個以上的運算式可用逗號加以分隔,它有兩種重要的特性。 1.所有被逗號分隔的運算式將按由左向右的方向依序加以求值。 2.整個逗號運算式的值乃為最右邊之運算式的值。
#include <stdio.h> #include <stdlib.h> int main() { int x, y, z; printf(" x y\n\n"); for(x=1, y=10; x<=6 && y<=60; x++, y=y+10) printf(" %d %d\n", x, y); printf("\n"); z = (x=100, (y = 1000) +14); printf("x = %d y = %d z = %d\n", x, y, z); } x y 1 10 2 20 3 30 4 40 5 50 6 60 x = 100 y = 1000 z = 1014
Break & Continue • break可以離開目前switch、for、while、do while的區塊,並前進至區塊後下一個陳述句,在switch中主要用來結束陳述句進行至下一個case的比對,在for、while與do while中,主要用於中斷目前的迴圈執行,如果break出現並不是內含在for、while迴圈中或switch陳述中,則會發生編譯錯誤, break的例子我們之前看過不少,這邊不再舉例。 continue的作用與break類似,主要使用於迴圈,所不同的是break會結束區塊的執行,而continue只會結束接下來區塊中的陳述句,並 跳回迴圈區塊的開頭繼續下一個迴圈,而不是離開迴圈
goto是一個很方便,但是最不被建議使用的語法,濫用它的話會破壞程式的架構、使得程式的邏輯難以trace,事實上,在完全不使用goto的情況下, 您也可以使用結構化的語法來撰寫程式。goto可以在程式中任意跳躍,跳躍前必須先設定好目的地,跳躍時必須指定目的地,例如: start: .... .... goto start;
變數儲存種類 • C語言主要提供四種變數儲存種類:自動(auto)、靜態(static)、外部(extern)、以及暫存器(register)等等。宣告這些儲存種類的時候,只要在一般的變數宣告敘述前加上明確的關鍵字即可: auto intnum, value; static char ch = 'A'; extern double ary[20]; register int cache;
auto:只使用在 function 中的本地變數,以下兩行宣告,結果一樣,所以一般都會省略 auto 宣告。 • register:宣告變數存儲在 register 而不是 RAM,可以加快存取速度。 • static:維持變數值存在於程式執行過程。 • extern:宣告變數為全域變數,也就是程式中的任何檔案都看得到這個變數。