C語言語法

C語言語法由國際標準化組織所制定。複合語句.C語言中的複合語句的格式為：語句;語句;複合語句可以使得幾個語句從文法上變成一個語句。有時必須使用複合語句，否則會產生錯誤。例如，在運用迴圈語句的時候，如果迴圈體，則必須使用花括號將他們合併成一個複合語句。如果不這麼做，系統僅把第一個分號前的內容看做迴圈體。需要注意的是，部分C編譯器並不支援在任意位置使用複合語句。條件語句.C語言有兩種條件語句形式，分別是if和switch。If 的格式如下：if (運算式) // 如果語句;// 有時還會有 else：else // 否則語句;運算式的值非零表示條件為真；如果條件為假，程式將跳過if處的語句，直接執行if後面的語句。但是如果if後面有else，則當條件為假時，程式跳到else處執行。if和else後面的語句可以是另個if語句，這種套疊式的結構，允許更複雜的邏輯控制流程得以實現。在一般情況下，else一定與最接近的if成對，因此常用括弧{}越過此限制。比較下面兩種情況：if (邏輯表達)if (邏輯表示式)語句;else語句;下面是if的另一種格式if……else if……else……if (邏輯表示式)語句;else if (邏輯表示式) //在下面可以加入多個“else if()”語句語句;else語句;if (邏輯表示式甲) {if (邏輯表示式乙)語句;else語句;要注意這裡的縮排和換行只用於方便閱讀。編譯器並不會根據縮排層級猜測 if 和 else 的對應關係。switch通常用於對幾種有明確值的條件進行控制。它要求的條件值通常是整數或字元。與switch搭配的條件轉移是case。使用case後面的標值，控制程式將跳到滿足條件的case處一直往下執行，直到語句結束或遇到break。通常可以使用default把其他例外的情況包含進去。如果switch語句中的條件不成立，控制程式將跳到default處執行；如果省略default子句，則直接執行下一語句。switch是可以巢狀的。switch (值) {case 甲:case 乙:語句段1; // 甲乙都會執行// 更多語句…break; // 跳轉到 switch 末尾處case 丙:語句段2;break;default: // 無論如何都會匹配語句段3;簡單的條件判斷也可用?:運算式?值1:值2;如:a=b&gt;c?b:c // 如果變數"b"的值大於變數"c" 把變數"b"的值賦予變數"a"迴圈語句.C語言有三種形式的迴圈語句：do語句while(判斷式);和:while(判斷式)語句;和:for(起始化;判斷式;運算式)語句;在while和for中，語句將執行到表示式的值為零時結束。在do...while語句中，迴圈將至少被執行一次。這三種迴圈結構可以互相轉化：for(起始化;判斷式;運算式)語句;如果語句中不使用continue語句的話，相當於起始化;while (判斷式) {語句;運算式;當迴圈條件一直為真時，將產生無窮迴圈。跳轉語句.跳轉語句包括四種：goto，continue，break和return。goto 標記;goto語句是無條件轉移語句，且標記必須在當前函式中定義，使用“標記:”的格式定義。程式將跳到標記處繼續執行。由於goto容易產生閱讀上的困難，所以對新手應該儘量少用。GCC 編譯器拓展支援對指標 goto和宏內 goto，一定程度上增強了 goto 的可讀性。continue語句用在迴圈語句中，作用是結束當前一輪的迴圈，馬上開始下一輪迴圈。break語句用在迴圈語句或switch中，作用是結束當前迴圈，跳到迴圈體外繼續執行。但是使用break只能跳出一層迴圈。在要跳出多重迴圈時，可以使用goto使得程式更為簡潔。當一個函式執行結束後要返回一個值時，使用return。return可以跟一個運算式或變數。如果return後面沒有值，將執行不返回值。在C語言中的運算子號.見C和C++運算子。資料型別.見資料型別 (C語言)。陣列.如果一個變數名後面跟著一個有數字的中括弧，這個宣告就是陣列宣告。字串也是一種陣列，它們以ASCII的NUL作為陣列的結束。要特別注意的是，方括內的索引值是從0算起的。例如：int myvector [100]；/* 從myvector[0]至[99]共100個元素 */char mystring [80]；// 宣告時初始化float mymatrix [3] [2] = {2.0 , 10.0, 20.0, 123.0, 1.0, 1.0};int notfull [3][3] = ;// 陣列套陣列char lexicon [10000] [300]；/* 共一萬個最大長度為300的字元陣列。*/int a[3][4]；上面最後一個例子建立了一個陣列，但也可以把它看成是一個多維陣列。注意陣列的下標從0開始。這個陣列的結構如下：例子中notfull建立了一個3*3的二維陣列，初始化時有些元素並未賦值。如下：1 ? ?1 2 34 5 ?根據C標準的規定，在存在初始化列表時，如果初始化列表中未提供對所有元素的初始化，則剩餘元素會被預設初始化，並使用與靜態變數相同的初始化規則。指標.如果一個變數宣告時在前面使用 * 號，表明這是個指標型變數。換句話說，該變數儲存一個地址，而 * 則是取內容運算子，意思是取這個記憶體地址裡儲存的內容。把這兩點結合在一起，可將 codice_1看作是 “*a 解得的內容型別為 int”，對更復雜的宣告也如此。指標是 C 語言區別於其他同時代高階語言的主要特徵之一。指標不僅可以是變數的地址，還可以是陣列、陣列元素、函式的地址。透過指標作為形式引數可以在函式的呼叫過程得到一個以上的返回值（不同於codice_2這樣的僅能得到一個返回值。指標是一把雙刃劍，許多操作可以透過指標自然的表達，但是不正確的或者過分的使用指標又會給程式帶來大量潛在的錯誤。例如：int *pi; // 指向整型資料的指標 piint * api[3];// 由指向整型資料的指標構成的陣列，長度為 3char ** argv;// 指向一個字元指標的指標struct { int member; } stinst,* pst = &amp; stinst;// pst是一個指向一個匿名結構體的指標儲存在指標中的地址所指向的數值在程式中可以由 * 讀取。例如，在第一個例子中， *pi 是一個整型資料。這叫做引用一個指標。另一個運算子 &amp;，叫做取地址運算子，它將返回一個變數、陣列或函式的儲存地址。因此，下面的例子：int i, *pi; /* int and pointer to int */pi = &amp;i;i 和 *pi 在程式中可以相互替換使用，直到 pi 被改變成指向另一個變數的地址。當指標指向結構體時，可以使用運算子 -&gt; 代替 *和. 的作用，如 (*p).m 與 p-&gt;m 等效。字串.C語言的字串其實就是char型陣列，所以使用字串並不需要引用庫。然而C標準庫確實包含了用於對字串進行操作的函式，使得它們看起來就像字串而不是陣列。使用這些函式需要引用標頭檔string.h。檔案輸入／輸出.在C語言中，輸入和輸出是經由標準函式庫中的一組函式來實現的。在ANSI/ISO C中，這些函式被定義在標頭檔stdio.h中。標準輸入/輸出.有三個標準輸入/輸出是標準I/O庫預先定義的：下面的這個例子顯示了一個過濾程式是怎樣構成的。int main(int argc, const char * argv[])char c;while ((c=getchar())!=EOF)putchar(c);perror("getchar() got EOF");return -1;函式.C語言的基本結構單位是函式，就像是Fortran中的子程式和函式。C語言的一個函式由返回值、函式名、引數列表和函式體組成。函式體的語法和其它的複合的語句部分是一樣的。C函式可以是庫中自帶的函式，也可以是使用者定義的函式，且不允許函式巢狀定義。在一個C語言編寫的程式開始執行時，系統首先呼叫 main函式，從此處開始執行。透過函式的巢狀呼叫，再呼叫其他函式。函式通常會返回一個值給呼叫程式的殼層，表明程式是否成功執行。保留關鍵字.以下是ANSI/ISO C標準中定義的C語言的保留關鍵字：C99標準新增了以下關鍵字：C11標準新增了以下關鍵字：