熟練掌握switch語句:技巧與運用

目錄

一、switch語句基礎

基本語法結構:

在C/C++中:

注意事項:

二、if與switch語句對比

示例:計算整數除以3的余數

使用if語句實現:

使用switch語句實現:

三、break語句的作用

示例(無break的情況):

練習:輸入1-7的數字,輸出對應的星期名稱

參考代碼:

需求變更后:

修改后的參考代碼:

四、default子句

五、注意事項


一、switch語句基礎

????????除了if語句外,C語言還提供了switch語句來實現分支結構。switch語句是一種特殊形式的if-else結構,專門用于處理多條件分支的情況,它能夠將復雜的else-if結構轉換為更易用、可讀性更好的形式。

基本語法結構:

switch (expression) {case value1: statement1;break;case value2: statement2;break;...default: default_statement;break;
}

????????上述代碼根據 expression 的不同取值執行對應的 case 分支。若未匹配到任何值,則執行 default 分支。

????????在大多數編程語言中,switch?語句的?case?標簽右邊的值(value)通常是?整型(int)?或可以隱式轉換為整型的類型(如?charenum,但具體規則取決于語言。

在C/C++中:

  • case?值必須是整型常量表達式(如?intcharenum)。

  • 字符類型(char)也是歸類到整型家族,因為字符的本質ASCII碼值,這個值是整數。

  • 不允許字符串、浮點數或變量(C++11 后允許?constexpr)。

    switch (x) {case 1:         // 合法(整型)case 'a':       // 合法(char 隱式轉 int)case ENUM_VAL:  // 合法(enum 隱式轉 int)// case 1.5:     // 非法(浮點數)break;
    }

注意事項:

  1. switch后的表達式(expression)必須是整型表達式

  2. case后的值必須是整型常量表達式

  3. case和值之間必須有空格

  4. 每個case語句執行完畢后通常需要添加break以跳出switch結構


二、if與switch語句對比

示例:計算整數除以3的余數

使用if語句實現:

#include <stdio.h>
int main() {int n = 0;scanf("%d", &n);if(n%3 == 0)printf("整除,余數為0\n");else if(n%3 == 1)printf("余數是1\n");elseprintf("余數是2\n");return 0;
}

使用switch語句實現:

#include <stdio.h>
int main() {int n = 0;scanf("%d", &n);switch(n%3) {case 0:printf("整除,余數為0\n"); break;case 1:printf("余數是1\n"); break;case 2:printf("余數是2\n"); break;}return 0;
}

在編寫代碼時,需要注意以下關鍵點:

  1. case關鍵字與后續數字之間必須保留空格
  2. 每個case語句塊執行完畢后,必須添加break語句才能正確退出switch結構

三、break語句的作用

????????在switch語句中,break用于終止當前case的執行并跳出整個switch結構。如果省略break,程序會繼續執行下一個case中的語句,這種現象稱為"case穿透"。

示例(無break的情況):

#include <stdio.h>
int main() {int n = 0;scanf("%d", &n);switch(n%3) {case 0:printf("整除,余數為0\n"); case 1:printf("余數是1\n"); case 2:printf("余數是2\n"); }return 0;
}

當輸入7時(7%3=1),輸出將是:

????????我們發現程序在計算7除以3時,本該顯示余數為1,但運行結果卻多輸出了"余數是2"的信息。這到底是什么原因呢?

????????問題出在switch語句的分支機制上。switch語句需要配合break才能實現真正的分支效果。當某個case語句后缺少break時,程序會繼續向下執行,可能進入其他case的代碼塊,直到遇到break或switch語句結束。例如在上述代碼中,程序就意外執行了case 2的語句。

????????因此,在switch語句中合理使用break至關重要,它能確保正確的分支控制。不過需要注意的是,并非每個case都必須包含break,這需要根據具體業務邏輯來決定。

練習:輸入1-7的數字,輸出對應的星期名稱

示例: 輸入1 → 輸出"星期一" ;輸入2 → 輸出"星期二" ;輸入3 → 輸出"星期三" ;輸入4 → 輸出"星期四" ;輸入5 → 輸出"星期五" ;輸入6 → 輸出"星期六" ;輸入7 → 輸出"星期天"

參考代碼:

#include <stdio.h>
int main() {int day;scanf("%d", &day);switch(day) {case 1: printf("星期一\n"); break;case 2: printf("星期二\n"); break;case 3: printf("星期三\n"); break;case 4: printf("星期四\n"); break;case 5: printf("星期五\n"); break;case 6: printf("星期六\n"); break;case 7: printf("星期天\n"); break;}return 0;
}

需求變更后:

  1. 輸入1-5時輸出"工作日"
  2. 輸入6-7時輸出"休息日"

修改后的參考代碼:

#include <stdio.h>
int main() {int day;scanf("%d", &day);switch(day) {case 1:case 2:case 3:case 4:case 5: printf("工作日\n"); break;case 6:case 7: printf("休息日\n"); break;}return 0;
}

????????通過這個練習可以看出,在實際編碼時需要根據具體需求來決定break語句的使用位置,這樣才能正確實現功能需求。


四、default子句

????????當switch表達式的值與所有case都不匹配時,會執行default子句中的代碼。default不是必須的,但建議總是包含它以處理意外情況。

switch (expression) 
{
case value1:statement;break;
case value2:statement;break;
default:statement;
}

當 expression 的值既不是 value1 也不是 value2 時,程序將執行 default 子句中的代碼。

????????比如之前的打印星期練習,當輸入的 day 值不在1到7范圍內時,若要提示"輸入錯誤",可以這樣編寫代碼:

#include <stdio.h>
int main() {int day = 0;scanf("%d", &day);switch(day) {case 1:printf("星期一\n");break;// ... 其他星期 ...case 7:printf("星期天\n");break;default:printf("輸入錯誤,請輸入1-7的數字\n");break;}return 0;
}

工作日與休息日判斷:

#include <stdio.h>
int main() {int day = 0;scanf("%d", &day);switch(day) {case 1:case 2:case 3:case 4:case 5:printf("工作日\n");break;case 6:case 7:printf("休息日\n");break;default:printf("輸入錯誤\n");break;}return 0;
}

五、注意事項

  1. case和default的順序可以任意排列,但通常將default放在最后

  2. case穿透有時是有意為之(如上面的工作日示例),但大多數情況下需要添加break

  3. switch語句只能處理離散的整數值,不能處理范圍判斷(如x > 10)

  4. 多個case可以共享同一組執行語句

通過合理使用switch語句,可以使多分支結構的代碼更加清晰、易于維護。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/92914.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/92914.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/92914.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【03】廈門立林科技——立林科技 嵌入式 校招筆試,題目記錄及解析

廈門立林科技——立林科技 嵌入式 校招筆試&#xff0c;題目記錄及解析 1.下面的程序的輸出是&#xff08;&#xff09;。2.在頭文件中#ifndef/#define/#endif的作用是4.執行下面程序中的輸出語句后,輸出的結果是()6.在32位處理器上,運行如下程序后p的值為()。10.設有兩字符串“…

C++算法(數據結構)版

C算法&#xff08;數據結構&#xff09;版 有些題目不是完整的題目&#xff0c;如需查看完整的題目請移步到acwing的算法基礎課中 文章目錄C算法&#xff08;數據結構&#xff09;版單鏈表思路&#xff1a;雙鏈表思路&#xff1a;棧思路&#xff1a;隊列思路&#xff1a;單調棧…

算法訓練營DAY57 第十一章:圖論part07

prim算法精講 53. 尋寶&#xff08;第七期模擬筆試&#xff09; 題目描述&#xff1a; 在世界的某個區域&#xff0c;有一些分散的神秘島嶼&#xff0c;每個島嶼上都有一種珍稀的資源或者寶藏。國王打算在這些島嶼上建公路&#xff0c;方便運輸。 不同島嶼之間&#xff0c;…

最短路問題從入門到負權最短路

一&#xff0c;BFS層次最短路/*題目描述 題目描述 給出一個 N 個頂點 M 條邊的無向無權圖&#xff0c;頂點編號為 1~N。 問從頂點 1 開始&#xff0c;到其他每個點的最短路有幾條。 輸入格式 第一行包含 2 個正整數 N,M&#xff0c;為圖的頂點數與邊數。 接下來 M 行&#xff…

AI智能體小白入門指南

AI智能體小白入門指南 ——什么是AI智能體&#xff1f;它們如何工作&#xff1f; 一、AI智能體是什么&#xff1f; AI智能體&#xff08;AI Agent&#xff09;是能感知環境、自主決策并執行動作的人工智能系統。 類比理解&#xff1a;像一個“虛擬機器人”或“數字助手”&#…

《設計模式》策略模式

1.策略模式定義 策略模式&#xff08;Strategy Pattern&#xff09;是一種行為型設計模式&#xff0c;它定義了一組算法&#xff0c;將每個算法封裝起來&#xff0c;并使它們可以相互替換&#xff0c;從而讓算法的變化獨立于使用它的客戶&#xff08;Client&#xff09;。 換…

AWS DMS 深度解析:從遷移任務到復制任務 - 全流程指南與最佳實踐

AWS Database Migration Service (DMS) 是一項強大的云服務,用于在源數據庫和目標數據庫之間安全地遷移數據。其核心優勢在于支持幾乎零停機時間的遷移,這主要歸功于其“變更數據捕獲 (CDC)”功能。理解遷移任務 (Migration Task) 和復制任務 (Replication Task) 的關系與操作…

國企社招 | 中國郵政2025年社會招聘開啟

添加圖片注釋&#xff0c;不超過 140 字&#xff08;可選&#xff09; 添加圖片注釋&#xff0c;不超過 140 字&#xff08;可選&#xff09; 添加圖片注釋&#xff0c;不超過 140 字&#xff08;可選&#xff09; 原文鏈接&#xff1a;“郵”你“政”好 | 廣東郵政2025年社會…

linux添加自啟動

linux添加自啟動 配置步驟&#xff1a; 創建systemd服務文件 sudo nano /etc/systemd/system/tme-vod.service將下面artifact中的內容復制到該文件中。 [Unit] DescriptionTME VOD Service Afternetwork.target[Service] Typesimple Userroot Grouproot WorkingDirectory/data/…

輕量級解決方案:如何高效處理Word轉PDF?

文檔格式轉換時&#xff0c;手動逐個處理總顯得效率低下。它的體積小巧&#xff0c;不到1MB&#xff0c;且無界面設計&#xff0c;運行極簡&#xff1a;將其與Word文件放入同一目錄&#xff0c;雙擊啟動&#xff0c;程序便會自動完成所有文檔的PDF轉換。操作零復雜度&#xff0…

Redis 數據傾斜

Redis 數據傾斜指的是在 Redis 集群模式下&#xff0c;數據&#xff08;以及相應的訪問請求和負載&#xff09;在各個分片&#xff08;Shard&#xff09;之間分布嚴重不均勻的現象。這會導致部分節點成為熱點或超載&#xff0c;而其他節點資源閑置&#xff0c;最終引發性能瓶頸…

Java基礎-TCP通信(多發多收和一發一收)

目錄 案例要求&#xff1a; 實現思路&#xff1a; 代碼&#xff1a; User:客戶端 Client:服務端 總結&#xff1a; 案例要求&#xff1a; 實現TCP通信的多發多收和一發一收,多發多收去掉各自的while循環就是一發一收,本文只模擬一發一收 實現思路&#xff1a; 客戶端(U…

WinForm 對話框的 Show 與 ShowDialog:阻塞與非阻塞的抉擇

目錄 核心概念&#xff1a;阻塞與非阻塞 Show 與 ShowDialog 的詳細對比 代碼示例&#xff1a;兩種方式的實現差異 使用 Show () 顯示非模態對話框 使用 ShowDialog () 顯示模態對話框 適用場景分析 適合使用 Show () 的場景 適合使用 ShowDialog () 的場景 最佳實踐與…

曉知識: 動態代理與靜態代理的區別

動態代理與靜態代理的區別 代理模式是一種常見的設計模式&#xff0c;用于在不修改原始類的情況下擴展其功能。代理分為靜態代理和動態代理兩種&#xff0c;它們在實現方式、適用場景和靈活性上有顯著差異。 靜態代理 靜態代理在編譯時就已經確定代理類和被代理類的關系。代理類…

Linux系統編程Day9 -- gdb (linux)和lldb(macOS)調試工具

往期內容回顧 Git 教程&#xff08;初階&#xff09; 基于Linux系統知識的第一個程序 自動化構建工具-make/Makefile gcc/g編譯及鏈接 Vim工具的使用 Linux常用工具&#xff08;yum與vim&#xff09; 一、 Linux 下的調試工具 GDB 一、為什么要學習 GDB&#xff1f; 調試是開發…

數據結構(17)排序(下)

一、計數排序計數排序又稱為鴿巢原理&#xff0c;是對哈希直接定址法的變形應用。操作步驟如下&#xff1a;①統計相同元素出現的次數 ②根據統計的結果將序列回收到原來的序列中比如&#xff0c;現在有一個數組{6,1,2,9,4,2,4,1,4}。該數組中&#xff0c;元素1出現兩次&#…

深度解析 Spring Boot 循環依賴:原理、源碼與解決方案

在 Spring Boot 開發中,循環依賴是一個常見且容易被忽視的技術點。當兩個或多個 Bean 相互引用時,就會形成循環依賴(如 A 依賴 B,B 依賴 A)。初學者往往會困惑:Spring 為什么能自動處理這種看似矛盾的依賴關系?本文將從原理、源碼實現到解決方案,全方位剖析 Spring Boo…

數據庫的基本操作(約束與DQL查詢)

一、約束約束是在表上強制執行的數據規則&#xff0c;用于確保數據的完整性和一致性&#xff08;1&#xff09;約束類型MySQL中支持多種約束類型&#xff1a;①主鍵約束&#xff08;PRIMARY KEY&#xff09; ②自增約束&#xff08;AUTO_INCREMENT&#xff09;③非空約束…

HP Pavilion G6 筆記本安裝Ubuntu開機后自動進入飛行模式的問題解決

問題一臺HP Pavilion G6 筆記本 &#xff0c;安裝了Ubuntu24.04版本&#xff0c;開機后&#xff0c;直接進入飛行模式&#xff0c;導致無法使用Wifi,且使用fnf10的組合鍵&#xff0c;也無法關閉飛行模式。使用fnf10鍵&#xff0c;可以看到提示顯示飛行模式&#xff0c;但無法關…

LLM:MoE原理與實現探索

文章目錄前言一、Deepseek Moe二. Moe架構1. Expert2. Gate3. MoE Module三、Auxiliary Loss總結前言 MoE&#xff08;Mixture of Experts) 已經逐漸在LLM中廣泛應用&#xff0c;其工程部署相關目前也有了越來越多的支持&#xff0c;本文主要記錄一下MoE的基本模塊構造與原理。…