
- C程式設計教程
- C - 首頁
- C語言基礎
- C - 概述
- C - 特性
- C - 歷史
- C - 環境設定
- C - 程式結構
- C - Hello World
- C - 編譯過程
- C - 註釋
- C - 詞法單元
- C - 關鍵字
- C - 識別符號
- C - 使用者輸入
- C - 基本語法
- C - 資料型別
- C - 變數
- C - 整數提升
- C - 型別轉換
- C - 型別強制轉換
- C - 布林值
- C語言中的常量和字面量
- C - 常量
- C - 字面量
- C - 轉義序列
- C - 格式說明符
- C語言中的運算子
- C - 運算子
- C - 算術運算子
- C - 關係運算符
- C - 邏輯運算子
- C - 位運算子
- C - 賦值運算子
- C - 一元運算子
- C - 自增和自減運算子
- C - 三元運算子
- C - sizeof運算子
- C - 運算子優先順序
- C - 其他運算子
- C語言中的決策
- C - 決策
- C - if語句
- C - if...else語句
- C - 巢狀if語句
- C - switch語句
- C - 巢狀switch語句
- C語言中的迴圈
- C - 迴圈
- C - while迴圈
- C - for迴圈
- C - do...while迴圈
- C - 巢狀迴圈
- C - 無限迴圈
- C - break語句
- C - continue語句
- C - goto語句
- C語言中的函式
- C - 函式
- C - 主函式
- C - 按值呼叫函式
- C - 按引用呼叫函式
- C - 巢狀函式
- C - 可變引數函式
- C - 使用者自定義函式
- C - 回撥函式
- C - 返回語句
- C - 遞迴
- C語言中的作用域規則
- C - 作用域規則
- C - 靜態變數
- C - 全域性變數
- C語言中的陣列
- C - 陣列
- C - 陣列的特性
- C - 多維陣列
- C - 將陣列傳遞給函式
- C - 從函式返回陣列
- C - 變長陣列
- C語言中的指標
- C - 指標
- C - 指標和陣列
- C - 指標的應用
- C - 指標運算
- C - 指標陣列
- C - 指標到指標
- C - 將指標傳遞給函式
- C - 從函式返回指標
- C - 函式指標
- C - 指向陣列的指標
- C - 指向結構體的指標
- C - 指標鏈
- C - 指標與陣列
- C - 字元指標和函式
- C - 空指標
- C - void指標
- C - 懸空指標
- C - 解引用指標
- C - 近、遠和巨型指標
- C - 指標陣列的初始化
- C - 指標與多維陣列
- C語言中的字串
- C - 字串
- C - 字串陣列
- C - 特殊字元
- C語言中的結構體和聯合體
- C - 結構體
- C - 結構體和函式
- C - 結構體陣列
- C - 自引用結構體
- C - 查詢表
- C - 點(.)運算子
- C - 列舉(或enum)
- C - 結構體填充和打包
- C - 巢狀結構體
- C - 匿名結構體和聯合體
- C - 聯合體
- C - 位域
- C - Typedef
- C語言中的檔案處理
- C - 輸入和輸出
- C - 檔案I/O(檔案處理)
- C預處理器
- C - 預處理器
- C - 指令
- C - 預處理器運算子
- C - 宏
- C - 標頭檔案
- C語言中的記憶體管理
- C - 記憶體管理
- C - 記憶體地址
- C - 儲存類
- 其他主題
- C - 錯誤處理
- C - 可變引數
- C - 命令執行
- C - 數學函式
- C - static關鍵字
- C - 隨機數生成
- C - 命令列引數
- C程式設計資源
- C - 問答
- C - 快速指南
- C - 速查表
- C - 有用資源
- C - 討論
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程式碼塊的最後一個語句都是一個break。 break語句將控制權移出switch結構的範圍。
你還可以將default case定義為switch結構中的最後一個選項。當表示式與任何先前的case值都不匹配時,執行default case程式碼塊。
switch-case語句的流程圖
表示C語言中switch-case結構的流程圖如下所示:

使用switch-case語句的規則
以下規則適用於switch語句:
switch語句中使用的表示式必須具有整型或列舉型別,或者屬於一個類型別,其中該類具有一個到整型或列舉型別的單一轉換函式。
你可以在一個switch中擁有任意數量的case語句。每個case後面跟著要比較的值和一個冒號。
當正在切換的變數等於某個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)程式碼塊中有多個語句,則必須將它們放在花括號內。因此,如果你的程式碼有許多if和else語句,則帶有許多花括號開合的程式碼看起來很笨拙。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”的不同值測試程式碼輸出。