主頁 >  其他 > 0基礎C語言自學教程——第三節 分支與回圈

0基礎C語言自學教程——第三節 分支與回圈

2021-10-30 11:37:03 其他

大家好~~~我是開心學編程,學到無極限的@jxwd😀

寫在前面

各位小伙伴還在為C語言的學習而苦惱嘛?

還在為沒有知識體系而煩心嘛?

別急,因為~~~~

接下來的兩個多月,我會持續推出C語言的有關知識內容,都是滿滿的干貨,從零基礎開始哦~,循序漸進😀,直至將C中知識基本全部學完🐂,關注我?,訂閱專欄 0基礎C語言保姆教學,就可以持續讀到我的文章啦😀🐕~~~~

本文為萬字長文,滿滿干貨,為防止找不到,可以收藏再看呦😀

本文為第三節

接下來,就將會詳細地介紹上一節每個模塊的內容,

本節,我們將會來介紹分支陳述句和回圈陳述句,

本節內容有:

目錄

什么是陳述句

陳述句的分類

分支陳述句(選擇陳述句)

if陳述句

懸空else

關于if陳述句的幾點代碼書寫的建議

switch陳述句

基本語法形式

break和default陳述句

注意事項

回圈陳述句

while回圈

基本構架

break與continue

for回圈

基本語法構建

for回圈里的break于continue

for回圈書寫建議

do....while回圈

基本語法形式

特點

do....while回圈里的continue與break

goto陳述句


什么是陳述句

陳述句實際上就相當于一個完整的指令,對計算機的指令,

陳述句的分類

C中的陳述句可以分為以下五大類:

  1. 運算式陳述句;
  2. 函式陳述句;
  3. 控制陳述句;
  4. 復合陳述句;
  5. 空陳述句,

我們今天就來介紹控制陳述句

控制陳述句可以分為以下三類

分支陳述句(條件判斷陳述句):if switch

回圈陳述句: for while do.....while

轉向陳述句:goto break return

分支陳述句(選擇陳述句)

我們的生活中面臨著很多選擇,也叫不同的分支:

比如,我想做下面的一種選擇,我在大學是談個戀愛還是好好學習?(假如只能夠二選一)

它的基本邏輯形式可以是這樣的:

(圖一)

這就是選擇陳述句,那么我如果想在以代碼的方式來實作,應當如何做呢?------答案就是應分支陳述句,

接下來,我們介紹常用的兩種分支陳述句:if陳述句和switch陳述句

if陳述句

if陳述句的基本語法形式:

(圖二)

需要注意的是,這里的運算式1為判斷陳述句

還可以是這樣兩種情況:

(圖三)

(圖四)

我們來用代碼實作一下:

(圖五)

按ctrl+(fn+)f5,讓程式運行,

(圖六)

現在如果我們輸入1,那么將會輸出(如圖七):

(圖七)

那我們輸入2呢?(如圖八)

(圖八)

那有沒有人想問了,如果我輸入3呢?就是不輸入1或者2,結果會怎樣?

我們來試一下(如圖九)

(圖九)

我們發現,它仍然是列印else里面的部分

原因很簡單,就是因為代碼執行到 if (a==1) 時,它會判斷a是否為1,而它的判斷邏輯是這樣的

a若為1,則為真,執行if里面的陳述句,

a若不為1,則為假,跳過if,直接進入else的部分中,執行else部分的陳述句,

我們提一嘴,何為真,何為假?

在C語言中,0表示假,非0表示真,

而在vs的環境中,如果條件判斷為真,則回傳1,如果條件判斷為假,則回傳0,

也就是說,

當執行到if(a==1)時,進行判斷,若條件為真,則回傳1,即變成 if(1) ;

否則,回傳0,即if(0),

當為真時,則執行if里的陳述句,當為假時,則跳過if陳述句里的內容,執行下面的內容,

我們還可以來看一下下面的代碼,以加深理解,

(圖十)

我們來分析一下,這個代碼是怎么運行的(看圖十一),

(圖十一)

那如果我輸入20呢?(圖十二給出答案)

(圖十二)

好,我們下面來看看懸空else,

懸空else

主要意識是說,當有多個else時,else會最先與最近的未被匹配的 if 配對

比如,來看下面一段代碼:

(圖十三)

請問,它會輸出什么?

我們來運行一下看看

(圖十四)

發現它什么也沒有輸出

為啥?

很簡單,就是剛剛的原因:else與上面離它最近的未比配的if匹配,

所以,當程式運行到if(a==1)上時,判斷為假,跳過if,直接運行到return 0,

里面的if(b==2)和else的陳述句都是if(a==1)的內容,

也就是說,它等價于下面的代碼:(圖十五)

(圖十五)

如果我們想讓其列印出haha ,代碼應該是這么寫的,

(圖十六)

這其實和我們的代碼書寫規范以及書寫習慣有很大的關系,而我們接下來就會給大家講講這個東西,

好,我們有關if陳述句的語法到此為止全部介紹完畢,

關于if陳述句的幾點代碼書寫的建議

1、每一句的 if 和 else 后面最好都跟上一個大括號,不論有幾條陳述句(哪怕只有一條),

說一下,這里的{}意為一個代碼塊,可以理解為一整個陳述句,

之所以這樣建議,有如下幾點理由:

1)看著舒服,看著整齊

2)不會出現像上文說的那樣else,if混搭的情況,而加上了{}則不會出現這種情況,并且這種情況正是在書寫不規范的情況下產生的,

3)這是一種規范對仗的書寫方式,如果再要增加陳述句的時候不用再去打括號了,極為方便,

4)大大增加可讀性,如果不加,如果if或者else后面有陳述句跟著,很難一眼辨認是否執行(不要不信,這可是筆者親自實驗過,當代碼量大、不停地看的時候,你真的會發現,帶上大括號看著真的是舒服,哪怕只有一條陳述句

5)在未來我們寫一些其他的陳述句的時候,會發現閱讀時哪怕是只有一條陳述句沒有{}也看起來是一件很難受的事情,所以不值得提倡,

有這么多好處,為啥不養成好的習慣呢?

如果有人反對說反而看著凌亂,這筆者認為這種觀點就跑遠了,每一個if/else后面都跟著一個小弟(即{}),那么漂亮而又整齊的縮進,怎么會顯得凌亂呢,不應該更顯整齊么?

2、我們寫出if后如果不跟else,看一下是否跟上else會更能增加代碼的可讀性,

我們舉個例子來理解:

(圖十七)

來對比一下,哪一種代碼更好?或者說哪一種代碼的可讀性更高?(當然我們暫時不考慮其能否正常運行)

顯然是第2種(即圖十七右圖)

因為第一種你一眼看過去很難判斷出來回傳x還是y,但是如果采用第二種,看著便會舒服地多😀

總的來說,我們的代碼寫的越對仗、if-else用的越整齊,會顯得代碼看著越舒服,可讀性更高,即我要思考代碼下一步該執行哪行的時間減少了,

3、如果寫判斷是否相等,可以考慮把常數寫在左邊,變數寫在右邊,(建議)

if里條件判斷是否相等一定要寫 ==;

我們如果寫if(a==5),如果寫成if(a=5),會發現編譯器也不會報錯

但是,我條件判斷如果寫成if(5==a),這個時候我如果寫成if(5=a),就是把兩個等號寫成一個等號時,編譯器就會報錯這樣就不會自己坑自己了~~哈哈,

不過,我們以后寫代碼可能都會寫成if(!a)這樣的形式;不過當我們寫成判斷是否相等時,把常量寫在左邊、變數寫在右邊是避免出錯的一種可以考慮采納的方式,

switch陳述句

基本語法形式

(圖十八)

它有什么用?

來看這樣一個輸入輸出樣例:

輸入1,輸出星期一

輸入2,輸出星期二

輸入3,輸出星期三

輸入4,輸出星期四

輸入5,輸出星期五

輸入6,輸出星期六

輸入7,輸出星期日

這怎么弄?

難不成我們需要一條一條的來用 if 寫?

這不太挫了么......?

有沒有什么其他更好的方法?

當然是有的,這就是switch陳述句

我們可以將上面的陳述句以這樣的方式來寫:

(圖十九)

(注:上圖中case2 的case和2中間應當有個空格,筆者圖弄好才發現,懶得改了~~哈哈)

我們來運行看一下:

(圖二十)

那我如果輸入的不是7,而是3呢?

我們來看一下:(如圖二十一)

(圖二十一)

為啥會輸出來的不是星期三,而是這么多一串?

這個就關系到了我們接下來要講的break陳述句了,請往下看,

break和default陳述句

我們回到剛剛的那個話題:

為啥會這樣?

因為,switch陳述句是這樣執行的,(如圖二十二)

(圖二十二)

(呃...上面幾個圖的return 0應該在switch陳述句{}的外面,我也是寫到這里才發現,讀者注意即可,筆者不刻意改了,哈哈~~~~)

那我們要它只輸出星期三,應該怎么辦呢?

這個時候,break陳述句的作用就出現了:

(圖二十三)

如上圖,當遇到break的時候,就會直接跳出switch回圈,這樣,我們就能只列印 星期三 了,

總結來說,就是:break陳述句 的實際效果是把陳述句串列劃分為不同的分支部分,

我們標題中還提到了一個關鍵字:default,這個是什么意思?

我們想一下,如果你所輸入的數,當對所有的case都不滿足情況的時候,怎么辦?

這個時候,程式并不會報錯,而是直接跳過所有的case,

但這時如果我們有default的時候,則執行default,

比如,還是上面的例子,我們加上一個default,這個時候,我們輸入8,則會執行default里的陳述句(如圖二十四),

(圖二十四)

注意事項

1、為養成好習慣,最好在每一條的case陳述句中的后面都加上一個break;以防止出現圖二十一的那種情況,

2、多個case陳述句可以共用一條(或者多條)執行陳述句,

什么意思?比如,我現在需求變了:

我想讓輸入1~5的時候輸出作業日;

在輸入6、7的時候輸出周末,

難道我每一個case的后面都要跟著一個printf么?

太繁瑣,顯然不用,

我們可以這樣寫(如圖二十五):

(圖二十五)

3、case和default沒有強制的位置關系,就是說default不一定要放在最后,放在哪里都可以,

回圈陳述句

說完了選擇分支,我們再來說說回圈陳述句,

回圈陳述句包含while回圈、do....while回圈和for回圈

while回圈

基本構架

while回圈我們之前介紹過,它的基本構架是這個樣子的:

(圖二十六)

同理,這里的exp1為條件判斷陳述句

回圈結構是這樣的:

(圖二十六)

我們來看這樣一個例子:

我們來在螢屏上列印一下1-100的數字:(如圖二十七)

(圖二十七)

(住:右邊的輸出只截取了部分,截不下了)

break與continue

下面的圖二十八還是借鑒剛剛上面那個圖(圖二十六)

(圖二十八)

for回圈

基本語法構建

(圖二十九)

(圖三十)

我們來簡單的舉一個例子:

(圖三十一)

(圖三十二)

所以,毫無疑問,它將會輸出0 1 2

(圖三十三)

for回圈里的break于continue

在for回圈里,break和continue的用法與在while回圈里相同

我們來看下面一個例子:

(圖三十四)

請問,左右兩個代碼分別會輸出什么?

(圖三十五)

我們可以看到,左邊的正常輸出了0-9,但是右邊卻進入了死回圈,

相信通過前面的介紹,讀者可以自行分析出原因所在了,

而這個例子,很好的對比了for和while回圈的特點

for回圈書寫建議

1、在回圈體里不要輕易改變回圈變數,

2、建議把條件判斷寫成前閉后開的形式,

具體的來說一下:

第一點的意思:比如,你這樣寫一個for回圈:

for( int i = 0; i < 10; i ++)

{

        if ( i > 5 )

        {

              i = 5;

        }

        else

        {
            printf( "%d" , i ); 

        }
        return 0;

}

這顯然是有bug的,顯然是一個死回圈,

所以筆者剛剛的意思就是說,在for回圈的回圈體的內部,不要輕易改變i 的值,因為這樣弄不好就弄成了個死回圈,

第二個,意思是說,比如我要回圈5次,建議寫成下面第一行的形式,而不是第二行的形式

for ( int i = 0; i < 5; i++)     //建議
for ( int i = 1; i <= 5; i++)    //不建議

為什么這樣說?因為第一行我們可以一眼看出來就是5次,又或者說是一種標準吧,

需要指出的是,在這里,筆者只是建議,具體的如果寫成第二種明顯更好的或者有寫第二種的需求的當然以更好的方式以及需求優先,

do....while回圈

基本語法形式

(圖三十六)

特點

這個回圈的最大的特點就是回圈體會至少執行一次

因使用場景有限,我們不常用,

我們最常用的是for回圈,

do....while回圈里的continue與break

這里的continue和break與上面我們說的for回圈和while回圈邏輯相同,

我們就舉個例子吧:

(圖三十七)

很明顯,左邊的是先打出10 9 8 7 6,然后接著一個死回圈,而右邊列印除10 9 8 7 6

goto陳述句

關于goto陳述句,我們簡單提一下:

C語言中提供了可以隨意濫用的 goto陳述句和標記跳轉的標號,

從理論上, goto陳述句是沒有必要的,實踐中沒有goto陳述句也可以很容易的寫出代碼,

但是某些場合下goto陳述句還是用得著的,最常見的用法就是終止程式在某些深度嵌套的結構的處理程序,

例如:一次跳出兩層或多層回圈,多層回圈這種情況使用break是達不到目的的,因為它只能從最內層回圈退出到上一層的回圈,

它的作用就是直接去跳轉,理論上想到哪就到哪,

我們來舉個栗子:

情景是這樣的:

現在視窗有提示:您的電腦將在1分鐘后關機,除非輸入:我是一只豬

(我們這里僅展示關鍵部分,理解即可)

圖(三十八)

那么我如果進入了else,就會goto(到)again那一行,然后繼續執行printf里面的代碼,

建議大家學完本節內容后可以再去聯系聯系代碼能力,上牛客、洛谷等網站找一些入門的題做一做,比如二分法查找等等,

好了,本節內容就到這里啦,我是@jxwd(健祥無敵)關注我,訂閱專欄,就可以第一時間享我的原創文章啦😀~~~

還是那句口號:jxwd,讓你服氣,拒絕水文,從我做起!與各位共勉!!!

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/342042.html

標籤:其他

上一篇:快速理解工廠方法模式,及其在原始碼中的應用

下一篇:BIGO Java 三面 + HR 面面經(已意向)

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more