C語言中的switch語句



一個switch語句允許將一個變數與其值的列表進行比較。每個值稱為一個case,並且正在切換的變數會針對每個switch case進行檢查。

C語言switch-case語句

switch-case語句是C語言中的一個決策語句if-else語句提供了兩個備選操作,而switch-case結構是一個多路分支語句。C語言中的switch語句透過將單個變數與其多個值進行比較,根據匹配情況執行特定程式碼來簡化多路選擇。它允許將變數與其值的列表進行比較。

switch-case語句的語法

程式的流程可以將行執行切換到滿足給定case的分支。switch-case結構的使用示意圖如下所示:

switch (Expression){

   // if expr equals Value1
   case Value1: 
      Statement1;
      Statement2;
      break;
   
   // if expr equals Value2
   case Value2: 
      Statement1;
      Statement2;
      break;
      .
      . 
   // if expr is other than the specific values above
   default:
      Statement1;
      Statement2;
}

switch-case語句如何工作?

switch關鍵字前面的括號包含一個表示式。該表示式應計算為整數或字元。在括號後面的花括號內,表示式的不同可能值形成case標籤。

case標籤前面的冒號(:)前的一個或多個語句形成一個程式碼塊,當表示式等於標籤的值時執行該程式碼塊。

你可以將switch-case字面翻譯為“如果表示式等於value1,則執行block1”,依此類推。

C語言會將表示式與每個標籤值進行比較,並執行第一個匹配項前面的程式碼塊。每個case程式碼塊的最後一個語句都是一個breakbreak語句將控制權移出switch結構的範圍。

你還可以將default case定義為switch結構中的最後一個選項。當表示式與任何先前的case值都不匹配時,執行default case程式碼塊。

switch-case語句的流程圖

表示C語言中switch-case結構的流程圖如下所示:

switch statement in C

使用switch-case語句的規則

以下規則適用於switch語句:

  • switch語句中使用的表示式必須具有整型或列舉型別,或者屬於一個類型別,其中該類具有一個到整型或列舉型別的單一轉換函式。

  • 你可以在一個switch中擁有任意數量的case語句。每個case後面跟著要比較的值和一個冒號。

  • case的常量表達式必須與switch中的變數具有相同的資料型別,並且必須是常量字面量

  • 當正在切換的變數等於某個case時,該case後面的語句將執行,直到遇到break語句。

  • 遇到break語句時,switch將終止,並且控制流跳轉到switch語句後面的下一行。

  • 並非每個case都需要包含break。如果沒有出現break,控制流將貫穿到後續的case,直到遇到break為止。

  • switch語句可以有一個可選的default case,它必須出現在switch的末尾。default case可用於在沒有case為真時執行任務。default case不需要break。

switch-case語句作為級聯if-else語句的簡潔替代方案,尤其是在“if”中的布林表示式基於“=”運算子時。

如果if(或else)程式碼塊中有多個語句,則必須將它們放在花括號內。因此,如果你的程式碼有許多ifelse語句,則帶有許多花括號開合的程式碼看起來很笨拙。switch-case替代方案是一種簡潔且整潔的解決方案。

C語言switch-case語句示例

練習以下示例以學習C程式語言中的switch case語句:

示例1

在以下程式碼中,一系列if-else語句根據“ch”變數的值(“m”,“a”或“e”分別表示早上、下午或晚上)列印三個不同的問候語。

#include <stdio.h>

int main(){

   /* local variable definition */
   char ch = 'e';
   printf("Time code: %c\n\n", ch);

   if (ch == 'm')
      printf("Good Morning");
   
   else if (ch == 'a')
      printf("Good Afternoon");
   else
      printf("Good Evening");

   return 0;
}

上面程式碼中的if-else邏輯在下面的程式碼中被switch-case結構替換:

#include <stdio.h>
 
int main (){

   // local variable definition
   char ch = 'm';
   printf("Time code: %c\n\n", ch);
   
   switch (ch){
      
      case 'a':
         printf("Good Afternoon\n");
         break;
      
      case 'e':
         printf("Good Evening\n");
         break;
      
      case 'm':
         printf("Good Morning\n");
   }
   return 0;
}

輸出

更改“ch”變數的值並檢查輸出。對於ch = 'm',我們得到以下輸出:

Time code: m

Good Morning

這裡break的使用非常重要。每個case對應的語句塊都以break語句結束。如果沒有使用break語句會怎樣?

switch-case的工作方式如下:當程式進入switch結構時,它開始將切換表示式的值與case進行比較,並執行第一個匹配項的程式碼塊。break導致控制權移出switch範圍。如果找不到break,則後續的程式碼塊也會執行,從而導致結果不正確。

示例2:不使用Break的Switch語句

讓我們註釋掉上面程式碼中的所有break語句。

#include <stdio.h>

int main (){

   /* local variable definition */
   char ch = 'a';
   printf("Time code: %c\n\n", ch);
   
   switch (ch){
      case 'a':
         printf("Good Afternoon\n");
         // break;
      
      case 'e':
         printf("Good Evening\n");
         // break;
      
      case 'm':
         printf("Good Morning\n");
   }
   return 0;
}

輸出

你期望列印“Good Morning”訊息,但發現列印了所有三條訊息!

Time code: a

Good Afternoon
Good Evening
Good Morning

這是因為在沒有break語句的情況下,C語言會貫穿後續的case程式碼塊。

示例3:使用Switch語句的成績檢查程式

在下面的程式中,“grade”是切換變數。對於不同等級的case,將列印相應的反饋訊息。

#include <stdio.h>
 
int main(){

   /* local variable definition */
   char grade = 'B';

   switch(grade){
      case 'A' :
         printf("Outstanding!\n" );
         break;
      case 'B':
        printf("Excellent!\n");
        break;
      case 'C':
         printf("Well Done\n" );
         break;
      case 'D':
         printf("You passed\n" );
         break;
      case 'F':
         printf("Better try again\n" );
         break;
      default :
         printf("Invalid grade\n" );
   }
   printf("Your grade is  %c\n", grade);
 
   return 0;
}

輸出

執行程式碼並檢查其輸出:

Excellent!
Your grade is  B

現在更改“grade”(它是“char”變數)的值並檢查輸出。

示例4:使用Switch進行算術運算的基於選單的計算器

以下示例顯示了一個算術運算的選單。根據運算子程式碼(1、2、3或4)的值,執行兩個值的加法、減法、乘法或除法。如果運算子程式碼是其他值,則執行default case。

#include <stdio.h>
 
int main (){

   // local variable definition
   int a = 10, b = 5;
   
   // Run the program with other values 2, 3, 4, 5
   int op = 1; 
   float result;
  
   printf("1: addition\n");
   printf("2: subtraction\n");
   printf("3: multiplication\n");
   printf("4: division\n");
   
   printf("\na: %d b: %d : op: %d\n", a, b, op);
   switch (op){
      case 1:
         result = a + b;
         break;
      case 2:
         result = a - b;
         break;
      case 3:
         result = a * b;
         break;
      case 4:
         result = a / b;
         break;
      default:
         printf("Invalid operation\n");
   }
   if (op >= 1 && op <= 4)
      printf("Result: %6.2f", result);
   
   return 0;
}

輸出

1: addition
2: subtraction
3: multiplication
4: division

a: 10 b: 5 : op: 1
Result:  15.00

對於“op”的其他值(2、3和4),你將得到以下輸出:

a: 10 b: 5 : op: 2
Result:   5.00

a: 10 b: 5 : op: 3
Result:  50.00

a: 10 b: 5 : op: 4
Result:   2.00

a: 10 b: 5 : op: 5
Invalid operation

透過組合多個Case來使用Switch語句

多個case可以組合在一起以執行一個程式碼塊。當任何一個case值匹配時,這些組合case的主體就會執行。如果你的情況是,對於表示式的多個case標籤,要執行相同的程式碼塊,則可以透過將兩個case一個接一個地放置來組合它們,如下所示:

語法

switch (exp) {
   case 1:
   case 2:
      statements;
      break;
   case 3:
      statements;
      break;
   default:
      printf("%c is a non-alphanumeric character\n", ch);
}

你還可以使用省略號(…)來組合表示式的值範圍。例如,要將切換變數的值與1到10之間的任何數字匹配,可以使用“case 1 … 10”

示例1

#include <stdio.h>

int main (){

   // local variable definition
   int number = 5;

   switch (number){

      case 1 ... 10:
         printf("The number is between 1 and 10\n");
         break;

      default:
         printf("The number is not between 1 and 10\n");
   }
   return 0;
}

輸出

執行程式碼並檢查其輸出。對於“number = 5”,我們得到以下輸出:

The number is between 1 and 10

示例2

以下程式檢查給定char變數的值是否儲存小寫字母、大寫字母、數字或任何其他鍵。

#include <stdio.h>

int main (){

   char ch = 'g';

   switch (ch){
      case 'a' ... 'z':
         printf("%c is a lowercase alphabet\n", ch);
         break;
      
      case 'A' ... 'Z':
         printf("%c is an uppercase alphabet\n", ch);
         break;
      
      case 48 ... 57:
         printf("%c is a digit\n", ch);
         break;
      
      default:
         printf("%c is a non-alphanumeric character\n", ch);
   }
   return 0;
}

輸出

對於ch = 'g',我們得到以下輸出:

g is a lowercase alphabet

使用“ch”的不同值測試程式碼輸出。

c_decision_making.htm
廣告