C語言筆記 05_判斷&循環&函數

判斷

C 語言把任何非零非空的值假定爲 true,把null 假定爲 falsehtml

下面是大多數編程語言中典型的判斷結構的通常形式:程序員

img

判斷語句

C 語言提供瞭如下類型的判斷語句。點擊連接查看每一個類型的細節。編程

語句 描述
if 語句 一個 if 語句 由一個布爾表達式後跟一個或多個語句組成。
if...else 語句 一個 if 語句 後可跟一個可選的 else 語句,else 語句在布爾表達式爲假時執行。
嵌套 if 語句 您能夠在一個 ifelse if 語句內使用另外一個 ifelse if 語句。
switch 語句 一個 switch 語句容許測試一個變量等於多個值時的狀況。
嵌套 switch 語句 您能夠在一個 switch 語句內使用另外一個 switch 語句。

還有咱們前面學過的三元運算符也能夠做爲判斷語句使用編程語言

循環

循環語句容許咱們屢次執行一個語句或語句組,下面是大多數編程語言中循環語句的流程圖:函數

img

循環類型

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 語句執行後自增語句仍然會執行。對於 whiledo...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 語言中,函數由一個函數頭和一個函數主體組成。下面列出一個函數的全部組成部分:

  • 返回類型:一個函數能夠返回一個值。return_type 是函數返回的值的數據類型。有些函數執行所需的操做而不返回值,在這種狀況下,return_type 是關鍵字 void
  • 函數名稱:這是函數的實際名稱。函數名和參數列表一塊兒構成了函數簽名。
  • 參數:參數就像是佔位符。當函數被調用時,您向參數傳遞一個值,這個值被稱爲實際參數。參數列表包括函數參數的類型、順序、數量。參數是可選的,也就是說,函數可能不包含參數。
  • 函數主體:函數主體包含一組定義函數執行任務的語句。

實例

如下是 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 使用傳值調用來傳遞參數。通常來講,這意味着函數內的代碼不能改變用於調用函數的實際參數。


參考自:https://www.runoob.com/cprogramming/c-tutorial.html

相關文章
相關標籤/搜索