C語言學習【3】——判斷與迴圈

@wr.net發表於2020-11-27

1.判斷

判斷結構要求程式設計師指定一個或多個要評估或測試的條件,以及條件為真時要執行的語句(必需的)條件為假時要執行的語句(可選的)

C 語言把任何非零和非空的值假定為 true,把零或 null 假定為 false

典型的判斷結構的一般形式:
在這裡插入圖片描述
1.1 判斷語句
C 語言提供了以下型別的判斷語句:
在這裡插入圖片描述

  1. if語句
if(boolean_expression)
{
   /* 如果布林表示式為真將執行的語句 */
}

如果布林表示式為 true,則 if 語句內的程式碼塊將被執行。如果布林表示式為 false,則 if 語句結束後的第一組程式碼(閉括號後)將被執行。

  1. if…else語句
if(boolean_expression)
{
   /* 如果布林表示式為真將執行的語句 */
}
else
{
   /* 如果布林表示式為假將執行的語句 */
}

如果布林表示式為 true,則執行 if 塊內的程式碼。如果布林表示式為 false,則執行 else 塊內的程式碼。

//C 語言中的 if...else if...else 語句的語法:這可用於測試多種條件。
if(boolean_expression 1)
{
   /* 當布林表示式 1 為真時執行 */
}
else if( boolean_expression 2)
{
   /* 當布林表示式 2 為真時執行 */
}
else if( boolean_expression 3)
{
   /* 當布林表示式 3 為真時執行 */
}
else 
{
   /* 當上麵條件都不為真時執行 */
}

當使用 if…else if…else 語句時,以下幾點需要注意:
一個 if 後可跟零個或一個 else,else 必須在所有 else if 之後。
一個 if 後可跟零個或多個 else if,else if 必須在 else 之前。
一旦某個 else if 匹配成功,其他的 else if 或 else 將不會被測試。

  1. 巢狀if語句
if( boolean_expression 1)
{
   /* 當布林表示式 1 為真時執行 */
   if(boolean_expression 2)
   {
      /* 當布林表示式 2 為真時執行 */
   }
}

C 語言中,巢狀 if-else 語句是合法的,這意味著您可以在一個 if 或 else if 語句內使用另一個 if 或 else if 語句。

也可以巢狀 else if…else,方式與巢狀 if 語句相似。

  1. switch語句
switch(expression){
    case constant-expression  :
       statement(s);
       break; /* 可選的 */
    case constant-expression  :
       statement(s);
       break; /* 可選的 */
  
    /* 您可以有任意數量的 case 語句 */
    default : /* 可選的 */
       statement(s);
}

一個 switch 語句允許測試一個變數等於多個值時的情況。每個值稱為一個 case,且被測試的變數會對每個 switch case 進行檢查。

switch 語句必須遵循下面的規則:
1.switch 語句中的 expression 是一個常量表示式,必須是一個整型或列舉型別。
2.在一個 switch 中可以有任意數量的 case 語句。每個 case 後跟一個要比較的值和一個冒號。
3.case 的 constant-expression 必須與 switch 中的變數具有相同的資料型別,且必須是一個常量或字面量。
4.當被測試的變數等於 case 中的常量時,case 後跟的語句將被執行,直到遇到 break 語句為止。
5.當遇到 break 語句時,switch 終止,控制流將跳轉到 switch 語句後的下一行。
6.不是每一個 case 都需要包含 break。如果 case 語句不包含 break,控制流將會 繼續 後續的 case,直到遇到 break 為止。
7.一個 switch 語句可以有一個可選的 default case,出現在 switch 的結尾。default case 可用於在上面所有 case 都不為真時執行一個任務。default case 中的 break 語句不是必需的。

  1. 巢狀switch語句
switch(ch1) {
   case 'A': 
      printf("這個 A 是外部 switch 的一部分" );
      switch(ch2) {
         case 'A':
            printf("這個 A 是內部 switch 的一部分" );
            break;
         case 'B': /* 內部 B case 程式碼 */
      }
      break;
   case 'B': /* 外部 B case 程式碼 */
}

可以把一個 switch 作為一個外部 switch 的語句序列的一部分,即可以在一個 switch 語句內使用另一個 switch 語句。即使內部和外部 switch 的 case 常量包含共同的值,也沒有矛盾。

1.2 三元運算子
? : 運算子

Exp1 ? Exp2 : Exp3;

Exp1、Exp2 和 Exp3 是表示式。請注意,冒號的使用和位置。

? 表示式的值是由 Exp1 決定的。

如果 Exp1 為真,則計算 Exp2 的值,結果即為整個 ? 表示式的值。

如果 Exp1 為假,則計算 Exp3 的值,結果即為整個 ? 表示式的值。

2.迴圈

2.1 迴圈型別

C 語言提供了以下4種迴圈型別:

在這裡插入圖片描述

  1. while迴圈
//只要給定的條件為真,C 語言中的 while 迴圈語句會重複執行一個目標語句
while(condition)
{
   statement(s);
}

在這裡,statement(s) 可以是一個單獨的語句,也可以是幾個語句組成的程式碼塊。

condition 可以是任意的表示式,當為任意非零值時都為 true。

當條件為 true 時執行迴圈。

當條件為 false 時,退出迴圈,程式流將繼續執行緊接著迴圈的下一條語句。

  1. for迴圈
//for 迴圈允許您編寫一個執行指定次數的迴圈控制結構
for ( init; condition; increment )
{
   statement(s);
}

for 迴圈的控制流:
1.init 會首先被執行,且只會執行一次。這一步允許您宣告並初始化任何迴圈控制變數。也可以不在這裡寫任何語句,只要有一個分號出現即可。
2.接下來,會判斷 condition。如果為真,則執行迴圈主體。如果為假,則不執行迴圈主體,且控制流會跳轉到緊接著 for 迴圈的下一條語句。
3.在執行完 for 迴圈主體後,控制流會跳回上面的 increment 語句。該語句允許您更新迴圈控制變數。該語句可以留空,只要在條件後有一個分號出現即可。
4.條件再次被判斷。如果為真,則執行迴圈,這個過程會不斷重複(迴圈主體,然後增加步值,再然後重新判斷條件)。在條件變為假時,for 迴圈終止。

  1. do…while迴圈
do
{
   statement(s);

}while( condition );

C 語言中,do…while 迴圈是在迴圈的尾部檢查它的條件。

do…while 迴圈與 while 迴圈類似,但是 do…while 迴圈會確保至少執行一次迴圈。

注意:
1.條件表示式出現在迴圈的尾部,所以迴圈中的 statement(s) 會在條件被測試之前至少執行一次。
2.如果條件為真,控制流會跳轉回上面的 do,然後重新執行迴圈中的 statement(s)。這個過程會不斷重複,直到給定條件變為假為止。

  1. 巢狀迴圈
//C 語言中 巢狀 for 迴圈 語句的語法:
for (initialization; condition; increment/decrement)
{
    statement(s);
    for (initialization; condition; increment/decrement)
    {
        statement(s);
        ... ... ...
    }
    ... ... ...
}
//C 語言中 巢狀 while 迴圈 語句的語法:
while (condition1)
{
    statement(s);
    while (condition2)
    {
        statement(s);
        ... ... ...
    }
    ... ... ...
}
//C 語言中 巢狀 do...while 迴圈 語句的語法:
do
{
    statement(s);
    do
    {
        statement(s);
        ... ... ...
    }while (condition2);
    ... ... ...
}while (condition1);

關於巢狀迴圈有一點值得注意,您可以在任何型別的迴圈內巢狀其他任何型別的迴圈。比如,一個 for 迴圈可以巢狀在一個 while 迴圈內,反之亦然。

2.2 迴圈控制語句

迴圈控制語句可以改變你程式碼的執行順序,通過它你可以實現程式碼的跳轉。

C 提供了下列的迴圈控制語句:
在這裡插入圖片描述

  1. break語句
break;

C 語言中 break 語句有以下兩種用法:

1.當 break 語句出現在一個迴圈內時,迴圈會立即終止,且程式流將繼續執行緊接著迴圈的下一條語句。

2.它可用於終止 switch 語句中的一個 case。

如果您使用的是巢狀迴圈(即一個迴圈內巢狀另一個迴圈),break 語句會停止執行最內層的迴圈,然後開始執行該塊之後的下一行程式碼。

  1. continue語句
continue;

C 語言中的 continue 語句有點像 break 語句。但它不是強制終止,continue 會跳過當前迴圈中的程式碼,強迫開始下一次迴圈。
1.對於 for 迴圈,continue 語句執行後自增語句仍然會執行。
2.對於 while 和 do…while 迴圈,continue 語句重新執行條件判斷語句。

  1. goto語句
goto label;
..
.
label: statement;

在這裡,label 可以是任何除 C 關鍵字以外的純文字,它可以設定在 C 程式中 goto 語句的前面或者後面。

在這裡插入圖片描述

C 語言中的 goto 語句允許把控制無條件轉移到同一函式內的被標記的語句。

注意:
在任何程式語言中,都不建議使用 goto 語句。因為它使得程式的控制流難以跟蹤,使程式難以理解和難以修改。任何使用 goto 語句的程式可以改寫成不需要使用 goto 語句的寫法。

不建議使用!

2.3 無限迴圈

如果條件永遠不為假,則迴圈將變成無限迴圈。for 迴圈在傳統意義上可用於實現無限迴圈。由於構成迴圈的三個表示式中任何一個都不是必需的,可以將某些條件表示式留空構成一個無限迴圈

#include <stdio.h>
 
int main ()
{
   for( ; ; )
   {
      printf("該迴圈會永遠執行下去!\n");
   }
   return 0;
}

當條件表示式不存在時,它被假設為真。也可以設定一個初始值和增量表示式,但是一般情況下,C 程式設計師偏向於使用 for(;? 結構來表示一個無限迴圈。

注意:按 Ctrl + C 鍵終止一個無限迴圈。

相關文章