解密C語言選擇結構:掌握條件語句與分支邏輯的利器

引言

C語?是結構化的程序設計語?,這?的結構指的是順序結構、選擇結構、循環結構。為什么有著三種結構呢,大家其實可以想象一下,生活中的絕大數事情都可以抽象著三種結構,而我們今天要給大家介紹的就是三大結構之一——選擇結構

選擇結構要求程序員指定一個或多個要評估或測試的條件,以及條件為真時要執行的語句(必需的)和條件為假時要執行的語句(可選的)。它的流程圖大致如下:

1. 邏輯運算符

在講解什么是選擇結構前,我們要先了解一些C語言常見的邏輯運算符。

1.1 邏輯取反運算符

邏輯取反運算符的形式特別簡單,只需要在需要進行取反操作的變量前+!:

!(變量名)

假設有變量a,它的取反規則如下:

1.2 與運算符

在C語言中,并不支持數學上的且,而是由一個運算符&&代替的。比如說數學上的0<x<10寫成C語言的形式就是x>0&&x<10。

假設有兩個變量a,b,與運算符的運算規則如下:

1.3 或運算符

在C語言中,或者也有專門的運算符表示——||

假設有兩個變量a,b,或運算符的運算規則如下:

2. if......else語句

2.1 if語句

if語句是最簡單選擇結構語法之一,他的語法結構如下:

if ( 表達式 )語句

表達式成?(為真),則語句執?,表達式不成?(為假),則語句不執?。

C語言特別規定:非零為真,零為假。

例?:輸??個整數,判斷是否為奇數,如果是奇數打印是奇數

#include<stdio.h>
int main()
{int num = 0;scanf("%d", &num);if (num % 2 == 1)printf("%d 是奇數\n", num);return 0;
}

  • 首先輸入一個值(num),然后進入if語句判斷,如果num%2等于1,條件就為真,就會打印;反之,條件為假,就不會進入打印。

  • 特別注意:C語言中判斷是否相等的運算符是==,=是賦值符號。

2.2 else

我們繼續以上面例子為列,如果?個數不是奇數,那就是偶數了,如果任意?個整數,我們要清楚的判斷是奇數還是偶數怎么表?呢?這?就需要 if...else... 語句了,語法形式如下:

if ( 表達式 )語句1else語句2

所以上面的例子可以改寫成如下代碼:

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

  • 默認在 if 和 else 語句中默認都只控制?條語句

2.3 多個if else的使用

if else 語句也可以多個同時使用,構成多個分支,形式如下:

if(判斷條件1){語句塊1} else if(判斷條件2){語句塊2}else if(判斷條件3){語句塊3}else if(判斷條件m){語句塊m}else{語句塊n}

意思是,從上到下依次檢測判斷條件,當某個判斷條件成立時,則執行其對應的語句塊,然后跳到整個 if else 語句之外繼續執行其他代碼。如果所有判斷條件都不成立,則執行語句塊n,然后繼續執行后續代碼。

也就是說,一旦遇到能夠成立的判斷條件,則不再執行其他的語句塊,所以最終只能有一個語句塊被執行。

我們以下面這段代碼舉個例子:

#include<stdio.h>int main()
{int age = 0;scanf("%d", &age);if (age > 0 && age < 18) {printf("少年\n");}else if (age >= 18 && age < 30) {printf("青年\n");}else if (age >= 30 && age < 45) {printf("壯年\n");}else if (age >= 45 && age < 55) {printf("中年\n");}else if (age >= 55 && age < 75) {printf("老年\n");}else {printf("老壽星\n");}return 0;
}

假設我們輸入的是40,輸出:

2.4 if else的嵌套

if else也能嵌套使用,也就是說if執行的語句中也可以包含if else語句。我們用判斷三角形來具體說明這個問題:

#include <stdio.h>
int main()
{int a, b, c;while(scanf("%d%d%d", &a, &b, &c)==3){if (a + b > c && a + c > b && b + c > a) {if (a == b && b == c) {printf("是一個等邊三角形");}else if (a == b || a == c || b == c) {printf("是一個等腰三角形");}else if (a * a + b * b == c * c || a * a + c * c == b * b || b * b + c * c == a * a) {printf("是一個直角三角形");}else {printf("是一個普通三角形");}}else {printf("由%d,%d,%d三邊組成的不是三角形", a, b, c);}}return 0;
}

2.5 懸空的else

在書寫if....else語句時最好每一條語句后面都加上大括號

至于為什么,我們可以以下面這段代碼舉例

#include<stdio.h>
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 ,可以記住這樣?條規則, else 總是跟最接近的 if 匹配。最下面的else其實是與if(b==2)這條語句配對的,而不是與if(a==1)配對,當a等于0,自然不會進入任何語句。

3. switch語句

在我們學習多個lf else語句時候就會會發現,如果條件多的話,整個選擇結構就會變得很冗雜,所以C語言為了解決這個問題引入了switch,switch 是另外一種選擇結構的語句,用來代替簡單的、擁有多個分支的 if else 語句。

比如說下面這段代碼就會顯得十分冗余

int main()
{int day = 0;scanf("%d", day);if(day == 1)printf("星期一\n");else if(day == 2)printf("星期二\n");else if (day == 3)printf("星期三\n");else if (day == 4)printf("星期四\n");else if (day == 5)printf("星期五\n");else if (day == 6)printf("星期六\n");elseprintf("星期天\n");return 0;
}

3.1 switch的基本規則

switch的語法如下:

switch (expression) {case value1: statementcase value2: statementdefault: statement}

switch語句必須遵循下面的規則:

  1. switch語句中的括號是一個常量表達式,必須是一個整型或枚舉類型。

  2. 在一個 switch 中可以有任意數量的 case 語句。每個 case 后跟一個要比較的值和一個冒號。

3.2 break的重要性

學習完switch的語法之后,然后我們可以將最開始的例子改造

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

但是當我們一運行代碼就會發現問題:

為什么輸入1反而后續的結果都輸出了呢?

原因是 switch 語句也是分?效果的,只有在 switch 語句中使??break?才能在跳出 switch 語句,如果某?個 case 語句的后邊沒有 break 語句,代碼會繼續玩下執?,有可能執?其他 case語句中的代碼,直到遇到 break 語句或者 switch 語句結束。

所以在 switch 語句中 break 語句是?常重要的,能實現真正的分?效果。

當然, break 也不是每個 case 語句都得有,這就得根據實際情況來看了。

改造代碼后;

int main()
{int day = 0;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;
}

3.3 default的使用

在使? switch 語句的時候,我們經常可能遇到?種情況,?如?switch 后的表達式中的值?法匹配代碼中的 case 語句的時候,這時候要不就不做處理,要不就得在 switch 語句中加?default??句。

其語法如下:

switch (expression) {case value1: statementcase value2: statementdefault: statement}

  • switch 后邊的 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 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;default :printf("輸入錯誤\n");break;}return 0;
}

  • 在 switch 語句中 case 語句和 default 語句是沒有順序要求的,只要你的順序是滿?實際需求的就可以。不過我們通常是把 default ?句放在最后處理的。

4. 綜合練習

4.1 題目一

輸入三個整數x,y,z,請把這三個數由小到大輸出。

#include <stdio.h>
int main()
{int x, y, z, t;printf("請輸入三個數字:\n");scanf("%d%d%d", &x, &y, &z);if (x > y) { /*交換x,y的值*/t = x; x = y; y = t;}if (x > z) { /*交換x,z的值*/t = z; z = x; x = t;}if (y > z) { /*交換z,y的值*/t = y; y = z; z = t;}printf("從小到大排序: %d %d %d\n", x, y, z);return 0;
}

4.2 題目二

輸入某年某月某日,判斷這一天是這一年的第幾天?

#include <stdio.h>
int main()
{int day, month, year, sum, leap;printf("請輸入年、月、日,格式為:年,月,日(2015,12,10)\n");scanf("%d,%d,%d", &year, &month, &day);  // 格式為:2015,12,10switch (month) // 先計算某月以前月份的總天數{case 1:sum = 0; break;case 2:sum = 31; break;case 3:sum = 59; break;case 4:sum = 90;break;case 5:sum = 120;break;case 6:sum = 151;break;case 7:sum = 181; break;case 8:sum = 212; break;case 9:sum = 243;break;case 10:sum = 273; break;case 11:sum = 304; break;case 12:sum = 334; break;default:printf("輸入錯誤\n"); break;}sum = sum + day; // 再加上某天的天數if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) {// 判斷是不是閏年leap = 1;}else {leap = 0;}if (leap == 1 && month > 2) { // *如果是閏年且月份大于2,總天數應該加一天sum++;}printf("這是這一年的第 %d 天。", sum);printf("\n");return 0;
}

文章轉載自:Betty’sSweet

原文鏈接:https://www.cnblogs.com/bett/p/18028037

體驗地址:引邁 - JNPF快速開發平臺_低代碼開發平臺_零代碼開發平臺_流程設計器_表單引擎_工作流引擎_軟件架構

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

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

相關文章

Jenkins 中部署Nodejs插件并使用,并構建前端項目(3)

遇到多個版本nodeJS需要構建的時候 1、第一種就是一個配置安裝&#xff0c;然后進行選中配置 2、第二種就是插件&#xff1a;nvm-wrapper&#xff0c;我們還是選用NodeJS插件&#xff1a; &#xff08;1&#xff09;可以加載任意npmrc文件&#xff1b; &#xff08;2&#x…

鴻蒙NEXT出現有前途嗎?是否會和安卓、IOS開發歷程一樣?

只要有手機操作系統這玩意存在&#xff0c;一定是需要原生開發人員的&#xff0c;但隨著獨立操作系統越來越多的話&#xff0c;混合App開發可能是個“萬能解決方案”。 2024年&#xff0c;在中國&#xff0c;被各大媒體和開發者稱為“鴻蒙元年”。 在2023年底就有業內人士透露…

【es6】Map 和 Object 對象的區別

對象 Object Object 是一個特殊的對象&#xff0c;它本身是一個頂級對象&#xff0c;同時還是一個構造函數&#xff0c;還可以使用字面量的方式聲明一個對象本質上是鍵值對的集合&#xff0c;但是健只能是字符串 或 Symbol使用 . [] 去獲取object 的屬性&#xff0c;不存在則…

jenkins編譯使用nohup部署進程到后臺失敗,解決方法

在shell腳本中加入BUILD_IDdontKillMe server為二進制文件 #!/bin/bashBUILD_IDdontKillMenohup ./server & 原理&#xff1a;jenkins默認會在構建完成后殺掉構建過程中shell命令觸發的衍生進程。jenkins根據BUILD_ID識別某個進程是否為構建過程的衍生進程&#xff0c;故…

常見鎖策略,CAS,synchrodized原理講解

&#x1f3a5; 個人主頁&#xff1a;Dikz12&#x1f4d5;格言&#xff1a;那些在暗處執拗生長的花&#xff0c;終有一日會馥郁傳香歡迎大家&#x1f44d;點贊?評論?收藏 目錄 常見鎖策略 樂觀鎖和悲觀鎖 輕量級鎖和重量級鎖 自旋鎖和掛起等待鎖 讀寫鎖 公平鎖和非公平鎖…

基于Java+SpringBoot+Vue.js前后端分離玩具購物商城系統設計和實現 可行性分析

博主介紹&#xff1a;黃菊華老師《Vue.js入門與商城開發實戰》《微信小程序商城開發》圖書作者&#xff0c;CSDN博客專家&#xff0c;在線教育專家&#xff0c;CSDN鉆石講師&#xff1b;專注大學生畢業設計教育和輔導。 所有項目都配有從入門到精通的基礎知識視頻課程&#xff…

已解決java.lang.NullPointerException異常的正確解決方法,親測有效!!!

已解決 java.lang.NullPointerException 異常的正確解決方法&#xff0c;親測有效&#xff01;&#xff01;&#xff01; 文章目錄 問題分析 報錯原因 解決思路 總結 Q1 - 問題分析 在Java編程中&#xff0c;NullPointerException 可能是最常見的運行時異常之一。這種異…

基于Java在線考試網站系統 設計與實現(Springboot框架)畢業設計論文提綱參考

博主介紹&#xff1a;黃菊華老師《Vue.js入門與商城開發實戰》《微信小程序商城開發》圖書作者&#xff0c;CSDN博客專家&#xff0c;在線教育專家&#xff0c;CSDN鉆石講師&#xff1b;專注大學生畢業設計教育和輔導。 所有項目都配有從入門到精通的基礎知識視頻課程&#xff…

264.【華為OD機試真題】最長子字符串的長度(二)(動態規劃DP-JavaPythonC++JS實現)

??點擊這里可直接跳轉到本專欄,可查閱頂置最新的華為OD機試寶典~ 本專欄所有題目均包含優質解題思路,高質量解題代碼(Java&Python&C++&JS分別實現),詳細代碼講解,助你深入學習,深度掌握! 文章目錄 一. 題目-最長子字符串的長度(二)二.解題思路三.題解代碼…

Transformer 架構—Encoder-Decoder

文章目錄 前言 一、Encoder 家族 1. BERT 2. DistilBERT 3. RoBERTa 4. XML 5. XML-RoBERTa 6. ALBERT 7. ELECTRA 8. DeBERTa 二、Decoder 家族 1. GPT 2. GPT-2 3. CTRL 4. GPT-3 5. GPT-Neo / GPT-J-6B 三、Encoder-Decoder 家族 1. T5 2. BART 3. M2M-100 4. BigBird 前言 …

每日五道java面試題之spring篇(三)

目錄&#xff1a; 第一題 ApplicationContext和BeanFactory有什么區別&#xff1f;第二題 Spring中的事務是如何實現的&#xff1f;第三題 Spring中什么時候Transactional會失效&#xff1f;第四題 Spring容器啟動流程是怎樣的&#xff1f;第五題 Spring Boot、Spring MVC 和 S…

Sip網絡廣播號角,sip廣播系統公共廣播系統有源喇叭

Sip網絡廣播號角&#xff0c;sip廣播系統公共廣播系統有源喇叭 SV-7044VP網絡有源喇叭&#xff0c;具有10/100M以太網接口&#xff0c;內置高品質揚聲器&#xff0c;通過自帶放大器播放網絡音頻&#xff0c;揚聲器輸出功率高達30W&#xff0c;還支持設置最多10個組播優先區域&…

js如何拋異常,拋自定義的異常

js如何拋異常,拋自定義的異常 最簡單的自定義異常 throw "hello" 來自chrome123的控制臺的測試 throw "hello" VM209:1 Uncaught hello &#xff08;匿名&#xff09; VM209:1 try{ throw "hello";}catch(e){console.log(e);} VM338:1 hello…

nuxt項目搭建

1.先下載nuxt腳手架 yarn create nuxt-app <項目名>&#xff0c;記得安裝完項目&#xff0c;npm i,下載node包 目錄介紹 components 存放組件分別是頭部&#xff08;包含導航&#xff09;和底部 layouts 頁面布局&#xff0c;實現一個頁面整體架構規則&#xff0c;頭…

XTuner InternLM-Chat 個人小助手認知微調實踐

要解決的問題&#xff1a; 如何讓模型知道自己做什么&#xff0c;是什么樣身份。是誰創建了他&#xff01;&#xff01;&#xff01; 概述 目標&#xff1a;通過微調&#xff0c;幫助模型認清了解對自己身份弟位 方式&#xff1a;使用XTuner進行微調 微調前&#xff08;回答…

精致女童時尚穿搭~你想要的我都有哦

不論是版型還是顏色 都絕絕子的一件輕薄外套 整件看著干凈利落有設計感 兩側按扣式口袋超級實用的 穿著透氣不悶熱 搭配各種風格的褲子都一絕

【安卓基礎5】中級控件

&#x1f3c6;作者簡介&#xff1a;|康有為| &#xff0c;大四在讀&#xff0c;目前在小米安卓實習&#xff0c;畢業入職 &#x1f3c6;本文收錄于 安卓學習大全持續更新中&#xff0c;歡迎關注 &#x1f3c6;安卓學習資料推薦&#xff1a; 視頻&#xff1a;b站搜動腦學院 視頻…

中東阿拉伯阿聯酋迪拜媒體宣發稿新聞報道推廣有哪些平臺渠道?跨境出海營銷

【本篇由言同數字科技有限公司原創】阿拉伯聯合酋長國是一個經濟和文化極為繁榮的地區&#xff0c;其中的迪拜更是以其獨特的地理位置、國際化的環境和世界級的商業和金融中心而出名。 1. 全球市場&#xff1a;阿聯酋迪拜是一個全球化的商業樞紐&#xff0c;吸引了來自世界各地…

無線聽覺新體驗:南卡、韶音、墨覺骨傳導耳機綜合評測

作為一個資深的跑步愛好者&#xff0c;我幾乎離不開音樂的陪伴。不知道大家有沒有同感&#xff0c;有時候一首歌曲就是我堅持下去的動力&#xff0c;尤其是在那段艱難的跑步時刻。但是找到一款既能讓我在運動中自由呼吸、又能提供優質音樂體驗的耳機&#xff0c;并不是一件容易…

C#,動態規劃(DP)丟雞蛋問題(Egg Dropping Puzzle)的三種算法與源代碼

1 扔雞蛋問題 動態規劃&#xff08;Dynamic Programming&#xff0c;DP&#xff09;是運籌學的一個分支&#xff0c;是求解決策過程最優化的過程。20世紀50年代初&#xff0c;美國數學家貝爾曼&#xff08;R.Bellman&#xff09;等人在研究多階段決策過程的優化問題時&#xf…