C 語言分支與循環

?

目錄

?一. 分支結構:if 語句與 switch 語句

1. if 語句

2. switch 語句?

二、關系操作符、條件操作符與邏輯操作符?

1. 關系操作符

2. 條件操作符

3. 邏輯操作符

三、循環結構:while 循環、for 循環與 do - while 循環?

1. while 循環

2. for 循環

3. do - while 循環

四、break 和 continue 語句:循環控制的利器

(一)break 語句

(二)continue 語句

五、循環的嵌套與 goto 語句

(一)循環的嵌套

(二)goto 語句


? ? 在 C 語言的世界里,分支和循環結構編程的核心內容,它們賦予了程序根據不同條件執行不同操作以及重復執行特定代碼段的能力,讓程序變得更加智能和高效。今天,我們就深入探討 C 語言分支和循環的相關知識,助力大家夯實編程基礎。

?一. 分支結構:if 語句與 switch 語句

1. if 語句

? ? 1.1 基本形式與原理

? ? if 語句是 C 語言中最常用的分支結構之一。其基本語法為if (表達式) 語句,當表達式的值為非 0(在 C 語言中,非 0 表示真)時,執行后面的語句;若表達式的值為 0(表示假),則語句不執行 。例如,在判斷一個整數是否為奇數的代碼中:

int main()
{int num = 0;scanf("%d", &num);if(num % 2 == 1)printf("%d是奇數\n", num);return 0;
}

? ? 這里通過num % 2 == 1這個表達式來判斷num是否為奇數,若滿足條件則打印相應信息。

? ? 1.2?if...else... 結構

? ? 為了更全面地進行條件判斷,if...else...結構應運而生。語法為if (表達式) 語句1 else 語句2,當表達式為真時執行語句1,否則執行語句2。以判斷整數是奇數還是偶數為例:?

int main()
{int num = 0;scanf("%d", &num);if(num % 2 == 1)printf("%d是奇數\n", num);elseprintf("%d是偶數\n", num);return 0;
}

    ?1.3 控制多條語句

    ? ? 默認情況下,ifelse語句只控制一條語句。若要控制多條語句,需使用大括號{}將代碼括起來,形成程序塊或復合語句。例如:

    int main()
    {int age = 0;scanf("%d", &age);if(age >= 18) {printf("成年了\n");printf("可以談戀愛了\n");}else {printf("未成年\n");printf("不可以早戀哦\n");}return 0;
    }

    1.4 嵌套if語句:

    if else語句中,else可以與另一個if語句連用,構成嵌套 if 語句,實現更復雜的邏輯判斷。比如判斷一個整數是 0、正數還是負數:

    int main()
    {int num = 0;scanf("%d", &num);if(num == 0)printf("輸入的數字是0\n");else if(num > 0) printf("輸入的數字是正數\n");elseprintf("輸入的數字是負數\n");return 0;
    }

    1.5 懸空 else 問題:

    ? ? 當存在多個ifelse時,else總是與最接近的if匹配。例如:

    int main()
    {int a = 0;int b = 2;if(a == 1)if(b == 2)printf("hehe\n");elseprintf("haha\n");return 0;
    }

    ? ? 這段代碼中,else實際上與第二個if匹配,若想讓else與第一個if匹配,需添加大括號,增強代碼可讀性

    2. switch 語句?

    2.1 基本形式和應用場景:

    ? switch語句是另一種實現分支結構的方式,適用于判斷條件有多個結果的情況。其語法為:? ? ? ?

    ? switch (expression)

    ? {?

    ? ? case value1: statement;

    ? ? case value2: statement;

    ? ? default: statement;

    ? }

    ? ? 根據expression的值執行相應的case分支,若找不到匹配值,則執行default分支。例如,計算整數除 3 之后的余數:

    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;default :printf("沒有匹配的值");break;}return 0;
    }

    ? ? n%3的計算結果如果等于0 1 2就執行相應的語句,沒有相等的值就執行default后面的語句

    2.2 break 的重要性

    ? ? 在switch語句中,break用于跳出switch語句。若某case語句后沒有break,代碼會繼續執行后續case語句,直到遇到breakswitch語句結束。例如,去掉上述代碼中的break,會出現不符合預期的結果。

    2.3 default 子句

    ? ? 當switch后的表達式的值無法匹配代碼中的case語句時,可使用default子句進行處理。比如在打印星期的練習中,可用于提示輸入錯誤。

    2.4 case 和 default 的順序

    ? switch語句中case子句和default子句沒有嚴格的順序要求,但通常將default子句放在最后。

    二、關系操作符、條件操作符與邏輯操作符?

    1. 關系操作符

    ? ? C 語言中的關系操作符包括><>=<===!=,用于比較兩個值的大小或是否相等,構成關系表達式。關系表達式的結果通常為 0(假)或 1(真) 。使用時需注意,相等運算符==與賦值運算符=不同,同時應避免多個關系運算符連用。例如,判斷年齡是否在 18 歲到 36 歲之間,正確的寫法是if(age>=18 && age<=36),而不是if(18<=age<=36)

    int main()
    {int age = 30;if(age>18){printf("長大了");}else{printf("小孩");}return 0;
    }

    2. 條件操作符

    ? ? 條件操作符也叫三目操作符,形式為exp1? exp2: exp3。其計算邏輯是:若exp1為真,計算exp2,其結果為整個表達式的結果;若exp1為假,計算exp3,其結果為整個表達式的結果。

    int main()
    {int a = 3;int b = 4;int c = a > b ? 3 : 4;//如果a大于b給c賦值3,反之,賦值4printf("%d",c);return 0;
    }

    3. 邏輯操作符

    ? ? 3.1 邏輯取反運算符!

    ? ? 用于改變單個表達式的真假。例如,若flag為假,執行特定操作:

    int main()
    {int flag = 0;if(!flag){printf("do something\n");}return 0;
    }
    

    ? ? 3.2?邏輯與運算符&&

    ? ? 表示并且的意思,只有當兩側表達式都為真時,整個表達式才為真。如判斷月份是否在 3 月到 5 月(春天):if(month >= 3 && month <= 5)

    int main()
    {int month = 4;if(month >= 3 && month <= 5)//兩個條件同時滿足就執行下面的語句{printf("春天");}else{ ;}return 0;
    }

    ? ? 3.3 邏輯或運算符 ||:

    ? ? 表示或者的意思,只要兩側表達式至少有一個為真,整個表達式就為真。如判斷月份是否是 12 月、1 月或 2 月(冬天):if(month == 12 || month==1 || month == 2)

    ??

    int main()
    {int month = 4;if(month == 3 || month == 5 || month== 4)//三個條件滿足一個就執行下面的語句{printf("春天");}else{ ;}return 0;
    }

    ? ? 3.4 短路現象:

    ? ? C 語言邏輯運算符具有短路特性,總是先對左側表達式求值,再對右側表達式求值。若左側表達式滿足邏輯運算符的條件,就不再對右側表達式求值。例如,在if(month >= 3 && month <= 5)中,當month >= 3為假時,就不再判斷month <= 5

        三、循環結構:while 循環、for 循環與 do - while 循環?

        1. while 循環

        ? ? 語法與執行流程while循環的語法為while(表達式) 語句。執行時先判斷表達式的值,若為 0 則循環結束,若為非 0 則執行循環語句,之后再次判斷表達式,如此循環。

        ? ?

        ? ? 實踐應用:例如,在屏幕上打印 1 到 10 的值:

        int main()
        {int i = 1;while(i<=10){printf("%d ", i);i = i+1;}return 0;
        }

        ? ? 練習:輸入一個正整數,逆序打印其每一位。通過n%10獲取最低位,n=n/10去掉最低位,利用while循環實現

        int main()
        {int a = 1234;while (a){printf("%d ", a % 10);a = a / 10;}return 0;
        }

        2. for 循環

        ?

        ? ? 語法與執行流程for循環的語法為for(表達式1; 表達式2; 表達式3) 語句。其中,表達式1用于循環變量的初始化,表達式2用于循環結束條件的判斷,表達式3用于循環變量的調整 。執行時先執行表達式1,再判斷表達式2,若為真則執行循環語句,之后執行表達式3,然后再次判斷表達式2,直到表達式2為假時循環結束。

        ? ? 實踐應用:同樣是在屏幕上打印 1 到 10 的值,for循環的代碼為:

        int main()
        {int i = 0;for(i=1; i<=10; i++){printf("%d ", i);}return 0;
        }

        ? ? 與 while 循環的對比for循環和while循環都有初始化、判斷、調整三個部分,但for循環的這三個部分更集中,便于代碼維護,在形式上更具優勢

        ? ??

        ? ? 練習:計算 1 到 100 之間 3 的倍數的數字之和,可通過優化循環直接產生 3 的倍數來提高效率。

        int main()
        {int sum = 0;for (int i = 3; i <= 100; i = i + 3){sum = sum + i;}printf("%d ", sum);return 0;
        }

        3. do - while 循環

        ? ? 語法與執行流程do - while循環的語法為do 語句; while(表達式);。它先執行循環體語句,再判斷表達式的值,若為真則繼續循環,若為假則結束循環。其特點是循環體至少執行一次。

        ? ??

        ? ? 實踐應用:在屏幕上打印 1 到 10 的值,代碼如下:

        int main()
        {int i = 1;do{printf("%d ", i);i = i + 1;}while(i<=10);return 0;
        }

        練習:輸入一個正整數,計算其位數。使用do - while循環,因為即使輸入的數是 0,也可作為 1 位數統計

        int main()
        {int a = 0;int i = 0;scanf("%d", &a);do{a = a / 10;i++;} while (a);printf("%d", i);return 0;
        }

          四、break 和 continue 語句:循環控制的利器

          (一)break 語句

          ? ? break用于永久終止循環,一旦執行,直接跳出所在循環,繼續執行循環后面的代碼。在whilefordo - while循環中作用相同。例如,在while循環中,當i等于 5 時終止循環:

          int main()
          {int i = 1;while(i<=10){if(i == 5)break;printf("%d ", i);i = i+1;}return 0;
          }

          (二)continue 語句

          ? continue用于跳過本次循環中continue后面的代碼,直接進入下一次循環的判斷。在while循環和for循環中表現略有不同,在while循環中跳到循環判斷位置,而在for循環中會跳到循環調整部分。

          五、循環的嵌套與 goto 語句

          (一)循環的嵌套

          ? ? 三種循環(whiledo - whilefor)可以相互嵌套,解決更復雜的問題。例如,找出 100 到 200 之間的素數,需要使用兩層循環,外層循環遍歷 100 到 200 的數字,內層循環判斷每個數字是否為素數。

          int main()
          {for (int i = 100; i <= 200; i++){int falg = 0;for (int j = 2; j < i - 1; j++){if (i % j == 0){falg = 1;break;}}if (falg == 0){printf("%d ", i);}}return 0;
          }

          (二)goto 語句

          ? goto語句可以實現在同一個函數內跳轉到設置好的標號處。雖然使用不當會打亂程序執行流程,但在多層循環中,若想快速跳出循環,goto語句會更加便捷。

          int main()
          {printf("hehe\n");goto next;printf("haha\n");next:printf("跳過了haha的打印\n"); return 0;
          }

          通過對 C 語言分支和循環知識的詳細介紹,相信大家對這些重要的編程概念有了更深入的理解。在實際編程中,靈活運用這些知識,能夠編寫出更高效、更復雜的程序。希望大家不斷練習,提升自己的編程技能!

          練習:

          ?線段圖案_牛客題霸_牛客網

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

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

          相關文章

          【一文看懂Spring Boot2.x升級Spring Boot3.x】springboot2.x升級springboot3.x

          springboot2.x升級springboot3.x 背景升級jdk版本為17以上springboot版本修改javax包更新mybatis-plus升級swagger升級springdocspringdoc配置背景 當前項目是springboot2.5.9版本的springboot+mybatis-plus項目,需要升級到springboot3.5.0項目。 升級jdk版本為17以上 Spri…

          陽臺光伏防逆流電表革新者:安科瑞ADL200N-CT/D16-WF

          ——為家庭能源管理提供高精度、智能化解決方案 一、陽臺光伏爆發的背景 在全球能源轉型與碳中和目標的驅動下&#xff0c;陽臺光伏正以革命性姿態重塑家庭能源消費模式。從歐洲的“微型發電站”到中國的“萬億藍海”&#xff0c;這一創新技術不僅撬動了能源市場的結構性變革…

          美團完整面經

          面試崗位 面試的崗位 - 2025春季校招 【轉正實習】軟件服務工程師-后端方向&#xff08;成都 - 軟硬件服務-SaaS事業部&#xff09; 一面&#xff08;業務初試 - 30min&#xff09; 問題 自我介紹 Java基礎 HashMap底層用的數據結構是什么&#xff1f;是線程安全的嗎&…

          pysnmp 操作流程和模塊交互關系的可視化總結

          1. SNMP GET 操作序列圖 #mermaid-svg-KALvv8WkHJTsNCeu {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-KALvv8WkHJTsNCeu .error-icon{fill:#552222;}#mermaid-svg-KALvv8WkHJTsNCeu .error-text{fill:#552222;str…

          關于 /proc/net/tcp 與 /proc/$pid/net/tcp 的關系分析

          關于 /proc/net/tcp 與 /proc/$pid/net/tcp 的關系分析 1. 基礎概念 在 Linux 系統中&#xff0c;每個進程必定歸屬于一個且僅一個網絡命名空間&#xff08;Network Namespace&#xff09;。這是 Linux 命名空間隔離機制的核心特性之一。 /proc/net/tcp 顯示當前網絡命名空間…

          微信小程序 - 保存手機號等信息到通訊錄

          主要使用小程序 wx.addPhoneContact 這個api 一、界面 <view class"tab-item" bindtap"addToPhoneContacts">保存</view> 二、js 邏輯文件中 addToPhoneContacts() {wx.addPhoneContact({firstName: this.data.firstName, // 姓名mobilePh…

          計算機視覺一些定義解析

          1.GCT&#xff08;Gated Channel Transformation&#xff09; 定義 GCT&#xff08;Gated Channel Transformation&#xff09;是一種用于增強卷積神經網絡特征提取能力的模塊。它的核心思想是通過門控機制對特征圖的通道進行動態調整&#xff0c;從而突出對任務更有幫助的特…

          美團NoCode的Database 使用指南

          系列文章目錄 第一篇&#xff1a;美團NoCode設計網站的嘗試經驗分 第二篇&#xff1a;美團NoCode中的Dev Mode 使用指南 文章目錄 系列文章目錄Database 適用場景一、什么是 Database&#xff1f;二、準備流程1. 申請賬號 三、使用流程1.申請資源的同時可搭建 NoCode 頁面&…

          MVC 數據庫

          MVC 數據庫 引言 在軟件開發領域,Model-View-Controller(MVC)是一種流行的軟件架構模式,它將應用程序分為三個核心組件:模型(Model)、視圖(View)和控制器(Controller)。這種模式有助于提高代碼的可維護性和可擴展性。本文將深入探討MVC架構與數據庫之間的關系,以…

          1.11 HTTP 文件上傳的核心協議

          HTTP 文件上傳是 Web 開發中的常見需求&#xff0c;涉及到特殊的請求格式和處理機制。 一、HTTP 文件上傳的核心協議 1. 兩種主要方式 multipart/form-data&#xff08;主流&#xff09; 支持二進制文件和表單字段混合傳輸&#xff0c;由 Content-Type 頭部標識。applicatio…

          安裝 Poppler(Windows)

          下載 Poppler&#xff08;Windows&#xff09;&#xff1a;https://github.com/oschwartz10612/poppler-windows/releases/ 解壓在自己目錄下 配置系統環境變量&#xff1a;把 poppler-xx.x.x\bin 目錄加入你的環境變量 PATH 中。 檢查是否配置成功 pdfinfo

          Java學習筆記之:初識nginx

          Java學習筆記之&#xff1a;初識nginx PS&#xff1a;雖然總結的都很簡單&#xff0c;但是作為初學者并且本人記憶力較差所以每次學習新知識點后習慣性記錄下來&#xff0c;這樣加深一遍記憶并且便于日后復習。 介紹&#xff1a; Nginx是一款輕量級的Web服務器/反向代理服務器…

          Middleware

          中間件的定義&#xff1a;中間件是位于操作系統和應用程序之間的軟件層&#xff0c;用于解決分布式系統中通信、數據共享、資源管理等共性問題。消息隊列屬于通信中間件&#xff0c;用于在分布式系統中傳遞消息&#xff0c;實現應用解耦、異步通信和流量削峰。解耦系統&#xf…

          Mac如何配置ZSH并使用Oh-my-zsh?讓你的終端更加實用、美觀

          前言 現在&#xff0c;越來越多的人趨向使用ZSH取代(Linux)原本的Bash作為自己的終端Shell。的確&#xff0c;ZSH才是適用于現代的Shell&#xff1a; 更豐富的命令提示更鮮明的演示標記更強大的插件支持 什么是ZSH 回答什么是ZSH前&#xff0c;我們先解釋什么是Bash&#x…

          C++11新標準

          重點 auto 類型推導范圍 for 迭代初始化列表變參模板 新類型 C11新增了類型 long long 和 unsigned long long&#xff0c;以支持64位(或更寬)的整型;新增了類型 char16_t和 char32_t&#xff0c;以支持 16位和 32 位的字符表示;還新增了“原始”字符串。 常量 nullptr nu…

          SpringAI Prompt提示詞

          基本概念 Prompts提示詞 ? 提示詞的是引導AI模型輸出的輸入&#xff0c;提示詞的正確性直接影響模型輸出的。 Message消息 Message 接口封裝了 Prompt 文本內容、一組元數據屬性以及稱為 MessageType 的分類。Spring AI消息API&#xff1a; 其中最重要的就是角色&#xff1a; …

          力扣刷題——二分查找

          數組是存放在連續內存空間上的相同類型數據的集合數組下標都是從0開始的數組內存空間的地址是連續的正是因為數組在內存空間的地址是連續的&#xff0c;所以我們在刪除或者增添元素的時候&#xff0c;就難免要移動其他元素的地址。 使用二分查找法返回的元素下標可能不是唯一的…

          黑群暉NAS部署DeepSeek模型與內網穿透實現本地AI服務

          文章目錄 前言1.安裝Container Manager2. 啟動ssh功能3. ssh連接黑群暉4. 安裝Ollama5. 安裝deepseek模型6. 安裝open-webui圖形界面7. 安裝內網穿透7.1 下載cpolar套件7.2 配置群輝虛擬機7.3 配置公網地址小結 7.4 配置固定公網地址 總結 前言 在追求自建網絡存儲方案的極客群…

          Rust 學習筆記:處理任意數量的 future

          Rust 學習筆記&#xff1a;處理任意數量的 future Rust 學習筆記&#xff1a;處理任意數量的 future競爭的 future將控制權交給運行時構建我們自己的異步抽象 Rust 學習筆記&#xff1a;處理任意數量的 future 當兩個 future 切換到三個 future 時&#xff0c;我們也必須從使用…

          2025年TCP洪水攻擊防護實戰全解析:從協議對抗到AI智能防御

          一、2025年TCP洪水攻擊的新特征與挑戰 AI驅動的自適應攻擊 攻擊者利用生成式AI動態調整SYN報文特征&#xff08;如載荷內容、發送頻率&#xff09;&#xff0c;使攻擊流量與正常業務流量的差異率低至0.5%&#xff0c;傳統基于規則引擎的防御策略完全失效。 混合協議打擊常態化…