C 語言把任何非零和非空的值假定爲 true,把零或 null 假定爲 false。html
下面是大多數編程語言中典型的判斷結構的通常形式:程序員
C 語言提供瞭如下類型的判斷語句。點擊連接查看每一個類型的細節。編程
語句 | 描述 |
---|---|
if 語句 | 一個 if 語句 由一個布爾表達式後跟一個或多個語句組成。 |
if...else 語句 | 一個 if 語句 後可跟一個可選的 else 語句,else 語句在布爾表達式爲假時執行。 |
嵌套 if 語句 | 您能夠在一個 if 或 else if 語句內使用另外一個 if 或 else if 語句。 |
switch 語句 | 一個 switch 語句容許測試一個變量等於多個值時的狀況。 |
嵌套 switch 語句 | 您能夠在一個 switch 語句內使用另外一個 switch 語句。 |
還有咱們前面學過的三元運算符也能夠做爲判斷語句使用編程語言
循環語句容許咱們屢次執行一個語句或語句組,下面是大多數編程語言中循環語句的流程圖:函數
C 語言提供瞭如下幾種循環類型。點擊連接查看每一個類型的細節。oop
循環類型 | 描述 |
---|---|
while 循環 | 當給定條件爲真時,重複語句或語句組。它會在執行循環主體以前測試條件。 |
for 循環 | 屢次執行一個語句序列,簡化管理循環變量的代碼。 |
do...while 循環 | 除了它是在循環主體結尾測試條件外,其餘與 while 語句相似。 |
嵌套循環 | 您能夠在 while、for 或 do..while 循環內使用一個或多個循環。 |
for循環的結構體測試
for ( init; condition; increment ) { statement(s); }
循環控制語句改變你代碼的執行順序。經過它你能夠實現代碼的跳轉。指針
C 提供了下列的循環控制語句。點擊連接查看每一個語句的細節。code
控制語句 | 描述 |
---|---|
break 語句 | 終止循環或 switch 語句,程序流將繼續執行緊接着循環或 switch 的下一條語句。 |
continue 語句 | 告訴一個循環體馬上中止本次循環迭代,從新開始下次循環迭代。 |
goto 語句 | 將控制轉移到被標記的語句。可是不建議在程序中使用 goto 語句。由於它使得程序的控制流難以跟蹤,使程序難以理解和難以修改。 |
若是您使用的是嵌套循環(即一個循環內嵌套另外一個循環),break 語句會中止執行最內層的循環,而後開始執行該塊以後的下一行代碼。htm
對於 for 循環,continue 語句執行後自增語句仍然會執行。對於 while 和 do...while 循環,continue 語句從新執行條件判斷語句。
goto語法
goto label; .. . label: statement;
在這裏,label 能夠是任何除 C 關鍵字之外的純文本,它能夠設置在 C 程序中 goto 語句的前面或者後面。
實例
#include <stdio.h> int main () { /* 局部變量定義 */ int a = 10; /* do 循環執行 */ LOOP:do { if( a == 15) { /* 跳過迭代 */ a = a + 1; goto LOOP; } printf("a 的值: %d\n", a); a++; }while( a < 20 ); return 0; }
當上面的代碼被編譯和執行時,它會產生下列結果:
a 的值: 10
a 的值: 11
a 的值: 12
a 的值: 13
a 的值: 14
a 的值: 16
a 的值: 17
a 的值: 18
a 的值: 19
若是條件永遠不爲假,則循環將變成無限循環。for 循環在傳統意義上可用於實現無限循環。因爲構成循環的三個表達式中任何一個都不是必需的,您能夠將某些條件表達式留空來構成一個無限循環。
#include <stdio.h> int main () { for( ; ; ) { printf("該循環會永遠執行下去!\n"); } return 0; }
當條件表達式不存在時,它被假設爲真。您也能夠設置一個初始值和增量表達式,可是通常狀況下,C 程序員偏向於使用 for(;;) 結構來表示一個無限循環。
注意:您能夠按 Ctrl + C 鍵終止一個無限循環。
每一個 C 程序都至少有一個函數,即主函數 main() ,全部簡單的程序均可以定義其餘額外的函數。
能夠把代碼劃分到不一樣的函數中。如何劃分代碼到不一樣的函數中是由你本身來決定的,但在邏輯上,劃分一般是根據每一個函數執行一個特定的任務來進行的。
函數聲明告訴編譯器函數的名稱、返回類型和參數。函數定義提供了函數的實際主體。
C 標準庫提供了大量的程序能夠調用的內置函數。例如,函數 strcat() 用來鏈接兩個字符串,函數 memcpy() 用來複制內存到另外一個位置。
函數還有不少叫法,好比方法、子例程或程序,等等。
C 語言中的函數定義的通常形式以下:
return_type function_name( parameter list ) { body of the function }
在 C 語言中,函數由一個函數頭和一個函數主體組成。下面列出一個函數的全部組成部分:
如下是 max() 函數的源代碼。該函數有兩個參數 num1 和 num2,會返回這兩個數中較大的那個數:
/* 函數返回兩個數中較大的那個數 */ int max(int num1, int num2) { /* 局部變量聲明 */ int result; if (num1 > num2) result = num1; else result = num2; return result; }
函數聲明會告訴編譯器,函數名稱及如何調用函數。函數的實際主體能夠單獨定義。
函數聲明包括如下幾個部分:
return_type function_name( parameter list );
針對上面定義的函數 max(),如下是函數聲明:
int max(int num1, int num2);
在函數聲明中,參數的名稱並不重要,只有參數的類型是必需的,所以下面也是有效的聲明:
int max(int, int);
當您在一個源文件中定義函數且在另外一個文件中調用函數時,函數聲明是必需的。在這種狀況下,您應該在調用函數的文件頂部聲明函數。
建立 C 函數時,會定義函數作什麼,而後經過調用函數來完成已定義的任務。
當程序調用函數時,程序控制權會轉移給被調用的函數。被調用的函數執行已定義的任務,當函數的返回語句被執行時,或到達函數的結束括號時,會把程序控制權交還給主程序。
調用函數時,傳遞所需參數,若是函數返回一個值,則能夠存儲返回值。例如:
#include <stdio.h> /* 函數聲明 */ int max(int num1, int num2); int main () { /* 局部變量定義 */ int a = 100; int b = 200; int ret; /* 調用函數來獲取最大值 */ ret = max(a, b); printf( "Max value is : %d\n", ret ); return 0; } /* 函數返回兩個數中較大的那個數 */ int max(int num1, int num2) { /* 局部變量聲明 */ int result; if (num1 > num2) result = num1; else result = num2; return result; }
把 max() 函數和 main() 函數放一塊,編譯源代碼。當運行最後的可執行文件時,會產生下列結果:
Max value is : 200
若是函數要使用參數,則必須聲明接受參數值的變量。這些變量稱爲函數的形式參數。
形式參數就像函數內的其餘局部變量,在進入函數時被建立,退出函數時被銷燬。
當調用函數時,有兩種向函數傳遞參數的方式:
調用類型 | 描述 |
---|---|
傳值調用 | 該方法把參數的實際值複製給函數的形式參數。在這種狀況下,修改函數內的形式參數不會影響實際參數。 |
引用調用 | 經過指針傳遞方式,形參爲指向實參地址的指針,當對形參的指向操做時,就至關於對實參自己進行的操做。傳遞指針可讓多個函數訪問指針所引用的對象,而不用把對象聲明爲全局可訪問。 |
/* 函數定義 */ void swap(int *x, int *y) { int temp; temp = *x; /* 保存地址 x 的值 */ *x = *y; /* 把 y 賦值給 x */ *y = temp; /* 把 temp 賦值給 y */ return; }
如需瞭解 C 中指針的更多細節,請訪問 C - 指針 章節。
如今,讓咱們經過引用傳值來調用函數 swap()
#include <stdio.h> /* 函數聲明 */ void swap(int *x, int *y); int main () { /* 局部變量定義 */ int a = 100; int b = 200; printf("交換前,a 的值: %d\n", a ); printf("交換前,b 的值: %d\n", b ); /* 調用函數來交換值 * &a 表示指向 a 的指針,即變量 a 的地址 * &b 表示指向 b 的指針,即變量 b 的地址 */ swap(&a, &b); printf("交換後,a 的值: %d\n", a ); printf("交換後,b 的值: %d\n", b ); return 0; }
當上面的代碼被編譯和執行時,它會產生下列結果:
交換前,a 的值: 100
交換前,b 的值: 200
交換後,a 的值: 200
交換後,b 的值: 100
上面的實例代表了,與傳值調用不一樣,引用調用在函數內改變了 a 和 b 的值,實際上也改變了函數外 a 和 b 的值。
默認狀況下,C 使用傳值調用來傳遞參數。通常來講,這意味着函數內的代碼不能改變用於調用函數的實際參數。