C語(yǔ)言分支和循環(huán)詳解
前言
在本章,我會(huì)詳述分支和循環(huán)語(yǔ)句的概念與使用規(guī)范
一、什么是語(yǔ)句
我們常在一條代碼的末尾加一個(gè)分號(hào) “;” ,C語(yǔ)言中分號(hào)前的就是一條語(yǔ)句,例如
int a = 0;//這是一條語(yǔ)句 printf("%d\n",a);這又是一條語(yǔ)句
很簡(jiǎn)單的概念。
那么,如果單放一個(gè)分號(hào),分號(hào)前什么也不寫,算不算一條語(yǔ)句呢?
答:當(dāng)然也算,這是需要注意的一個(gè)小點(diǎn)。
二、分支語(yǔ)句
分支語(yǔ)句又叫選擇結(jié)構(gòu),就比如你如果認(rèn)真學(xué)習(xí),你就能找到好工作;如果你整天打游戲,那就等于你選擇了畢業(yè)后失業(yè)。是好好學(xué)習(xí),還是打游戲,這就是你的選擇,你的選擇會(huì)帶來(lái)相應(yīng)的結(jié)果,這就是分支語(yǔ)句。
分支語(yǔ)句:
- if
- switch
1.if語(yǔ)句
if語(yǔ)句的結(jié)構(gòu):
if(條件) 語(yǔ)句(帶來(lái)的結(jié)果); else 語(yǔ)句(帶來(lái)的結(jié)果);
如果滿足if括號(hào)里的條件,則實(shí)行if下面的語(yǔ)句,否則執(zhí)行else下面的語(yǔ)句。
上面是一種結(jié)構(gòu),還有一種叫多分支結(jié)構(gòu):
if(條件) (語(yǔ)句); else if(條件) (語(yǔ)句); else(條件) (語(yǔ)句);
其實(shí)就是在上一種結(jié)構(gòu)上,多了一個(gè)選擇else if。
接下來(lái)我舉一個(gè)完整的例子,以體重為例
#include <stdio.h> int main() { int weight = 0; scanf(“%d\n”,&weigth); if(weight<100) { printf("瘦子"); } else if(weight>100 && weight<150) { printf("正常") }`在這里插入代碼片` else { printf("偏重") } return 0; }
這里就是讓你輸入體重
- 如果滿足if(體重小于100),那么輸出:瘦子
- 如果滿足else if()體重在100至150之間,那么輸出:正常
注意:當(dāng)我們想表達(dá)體重大于100,小于150,我們通常會(huì)寫(100<weight<150),但在C語(yǔ)言中,這是錯(cuò)誤的。正確書寫應(yīng)該為(weight>100 && weight<150)。
這個(gè)符號(hào)&&成為邏輯與運(yùn)算符,只有當(dāng)兩個(gè)式子都為真的時(shí)候,它才會(huì)表達(dá)為真,與高中我們學(xué)的“或且非”的原理一樣。
在我們這個(gè)例子就是,當(dāng)weight同時(shí)滿足小于150和大于100的時(shí)候,它才會(huì)判斷為真,然后輸出結(jié)果
- 如果上面都不滿足,就輸出else的語(yǔ)句:偏重。
除此之外,還有個(gè)新手常犯的錯(cuò)誤,我們看以下代碼
#include <stdio.h> int main() { int a = 0;/第一行 int b = 2;/第二行 if(a == 1)/第三行 if(b == 2)/第四行 printf("好的\n");/第五行 else/第六行 printf("不好\n");/第七行 return 0;
可見(jiàn)第三行 if 和第六行的 else 是對(duì)齊的,想當(dāng)然的以為這兩個(gè)是對(duì)應(yīng)的,如果是這兩個(gè)對(duì)應(yīng)的話,程序執(zhí)行的步驟應(yīng)該是
1. 令a = 0,b = 2
2. 到第三行,判斷a是否為2,判斷為否
3. 執(zhí)行else打印“不好”
但是當(dāng)我們執(zhí)行會(huì)發(fā)現(xiàn),它什么都沒(méi)打印。
因?yàn)?,else 和 if 對(duì)應(yīng)的原則是,就近原則,其實(shí)第六行和第四行它們是挨最近的,所以是這兩處的else和if對(duì)應(yīng)。 因此,程序執(zhí)行的步驟應(yīng)該是
1. 令a = 0,b = 2
2. 判斷a是否為1,判斷為否
3. 下一級(jí)的if else語(yǔ)句不執(zhí)行,直接return 0
所以我們平時(shí)為避免這類錯(cuò)誤,應(yīng)當(dāng)注意使用大括號(hào)“{ }”
#include <stdio.h> int main() { int a = 0; int b = 2; if(a == 1) { if(b == 2) printf("好的\n"); } else { printf("不好\n"); } return 0;
這樣,它打印出來(lái)的就是“不好”。
2.switch語(yǔ)句
switch也是一直分支語(yǔ)句,常用于多分支,例如你輸入1,程序就輸出一月,你輸入2,程序就輸出二月,以此類推,用 if 語(yǔ)句寫比較麻煩,所以就誕生了switch語(yǔ)句。
switch語(yǔ)句:
switch(整型常量表達(dá)式) { 語(yǔ)句項(xiàng) }
語(yǔ)句項(xiàng)又是什么呢?
語(yǔ)句項(xiàng)是一些case語(yǔ)句,放在例子中為比較好理解
#include <stdio.h> int main() { int day = 1 ; 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; }
該程序執(zhí)行過(guò)程
1.int day = 1 這個(gè)值可以隨機(jī)
2.進(jìn)入switch語(yǔ)句
3.判斷day的值與哪個(gè)case相同
4.輸出該case下的語(yǔ)句
此外,該代碼中的break,為終止語(yǔ)句
何為終于語(yǔ)句?
答: 就是程序執(zhí)行到break,就終止了,很好理解。在switch語(yǔ)句中,實(shí)際上程序是判斷執(zhí)行哪個(gè)case,判斷到了,就直接跳到那個(gè)case那邊,之后接著執(zhí)行下面的代碼,是不會(huì)終止的。就等于十條斑馬線,你一跳,跳到了第三條,但之后你還要走完后面的七條。
所以break語(yǔ)句在這里的作用就是你跳到了第三條斑馬線,就讓你停下來(lái),不讓你走了
還有一種情況:如果表達(dá)的值與所有case標(biāo)簽的值都不匹配怎么辦?
答:其實(shí)不匹配在C語(yǔ)言中也不會(huì)被報(bào)錯(cuò),只是什么都不輸出。
當(dāng) switch表達(dá)式的值并不匹配所有case標(biāo)簽的值時(shí),我們可以用default子句 來(lái)規(guī)定其輸出什么,其實(shí)和case語(yǔ)句類似
default: { } break;
三、循環(huán)語(yǔ)句
循環(huán)語(yǔ)句有以下幾種
- while
- for
- do while
1.while循環(huán)
循環(huán),顧名思義就是程序去重復(fù)執(zhí)行一個(gè)指令,我們可以用此非常簡(jiǎn)短的寫出我們需要的東西。
我們發(fā)現(xiàn)生活中很多的實(shí)際的例子是:同一件事情我們需要完成很多次。
那我們?cè)趺醋瞿兀?C語(yǔ)言中給我們引入了:while語(yǔ)句,可以實(shí)現(xiàn)循環(huán)。
while的語(yǔ)法結(jié)構(gòu)
while(表達(dá)式) 循環(huán)語(yǔ)句;
當(dāng)我們一直循環(huán),直到滿足了表達(dá)式所規(guī)定的條件,程序才會(huì)跳出。
比如我們實(shí)現(xiàn)在屏幕上打印1-10的數(shù)字
#include <stdio.h> int main() { int i = 1; while(i<=10) { printf("%d ", i); i = i+1; } return 0; }
它運(yùn)行的步驟是
1.令i = 1
2.判斷 i 是否小于等于10
3.判斷為真,則進(jìn)入循環(huán)。
4.先打印 i 的數(shù)值
5.再i + 1
6.再判斷 i 是否小于等于10
7.以此類推
2.循環(huán)語(yǔ)句中的break與continue
break作用:
break在while語(yǔ)句中,起直接終止所有循環(huán)的作用。
continue作用:
continue在while語(yǔ)句中,起終止本次循環(huán)的作用,就是在本次循環(huán)中,碰到continue后面的語(yǔ)句就不執(zhí)行,直接跳到while判斷。
舉個(gè)例子能更好理解
#include <stdio.h> int main() { int i = 1; while(i<=10) { if(i == 5) continue; printf("%d ", i); i = i+1; } return 0; }
大家猜猜此時(shí)程序運(yùn)行之后 打印的值是多少?
答案是:1、2、3、4
該程序執(zhí)行步驟:
1.令 i = 1
2.判斷 i 是否小于等于10
3.判斷為真,進(jìn)入循環(huán)
4.在循環(huán)內(nèi)判斷 i 是否等于 5
5.不等于 則跳過(guò) if 的語(yǔ)句項(xiàng)continue
6.打印 i 的值
7.i + 1
8.再次循環(huán)
9.當(dāng)循環(huán)到i 等于 5 的時(shí)候 進(jìn)入 if 語(yǔ)句
10.執(zhí)行continue 跳過(guò)本次循環(huán)(不執(zhí)行后面的打印和 i + 1)
11.直接判斷 i 是否小于等于 10 (此時(shí) i 還等于5)
12.再次進(jìn)入 if 重復(fù) 9、10、11的動(dòng)作
相信這樣大家能夠更加理解continue的作用。
3.for循環(huán)
為什么有了 while 循環(huán)還要多個(gè) for 循環(huán)呢?
首先我們看for循環(huán)的語(yǔ)法:
for(表達(dá)式1,表達(dá)式2,表達(dá)式3) 循環(huán)語(yǔ)句:
表達(dá)式1
依舊舉個(gè)例子闡述:
(打印1-10的數(shù)字)
#include <stdio.h> int main() { int i = 0; //for(i=1/*初始化*/; i<=10/*判斷部分*/; i++/*調(diào)整部分*/) for(i=1; i<=10; i++) { printf("%d ", i); } return 0; }
這段代碼首先將 i 初始化為1,之后判斷 i 是否小于等于10,是則進(jìn)入循環(huán),執(zhí)行完整個(gè)代碼之后再i++(i自增1),再重復(fù)上述動(dòng)作直到 i 大于10停止循環(huán)。
那么可見(jiàn)for與while循環(huán)是類似的,但我們應(yīng)該在什么時(shí)候用for什么時(shí)候用while呢?
答:對(duì)一個(gè)數(shù)組進(jìn)行循環(huán)時(shí),如果每輪循環(huán)都是在循 環(huán)處理完后才將循環(huán)變量增加的話,使用for循環(huán)比較方便。
如果循環(huán)處理的過(guò)程中就要將循環(huán)變量增加時(shí),則使用while循環(huán)比較方便。
總結(jié)
本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
C++標(biāo)準(zhǔn)庫(kù)學(xué)習(xí)之weak_ptr智能指針用法詳解
這篇文章主要為大家詳細(xì)介紹了C++標(biāo)準(zhǔn)庫(kù)中weak_ptr智能指針用法的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-12-12C++驗(yàn)證LeetCode包圍區(qū)域的DFS方法
這篇文章主要介紹了C++驗(yàn)證LeetCode包圍區(qū)域的DFS方法,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07C語(yǔ)言?八大排序算法的過(guò)程圖解及實(shí)現(xiàn)代碼
排序是數(shù)據(jù)結(jié)構(gòu)中很重要的一章,本文主要為大家介紹了常用的八個(gè)排序算法(插入,希爾,選擇,堆排,冒泡,快排,歸并,計(jì)數(shù))的過(guò)程及代碼實(shí)現(xiàn),需要的朋友可以參考一下2021-12-12利用C語(yǔ)言實(shí)現(xiàn)經(jīng)典游戲斗獸棋
《斗獸棋》是一款棋類游戲,整個(gè)游戲畫面是分為兩塊區(qū)域,中間有河流分割兩塊區(qū)域,有橋梁可以讓彼此的動(dòng)物過(guò)河,要取得勝利,必須占領(lǐng)那一邊動(dòng)物的巢穴獲勝利。本文將用C語(yǔ)言實(shí)現(xiàn)這一游戲,需要的可以參考一下2022-03-03C語(yǔ)言內(nèi)存管理及初始化細(xì)節(jié)示例詳解
這篇文章主要為大家介紹了C語(yǔ)言內(nèi)存管理及初始化細(xì)節(jié)示例的詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-02-02C語(yǔ)言詳細(xì)分析宏定義與預(yù)處理命令的應(yīng)用
宏定義是用宏名來(lái)表示一個(gè)字符串,在宏展開(kāi)時(shí)又以該字符串取代宏名,這只是一種簡(jiǎn)單的替換。字符串中可以含任何字符,可以是常數(shù),也可以是表達(dá)式,預(yù)處理程序?qū)λ蛔魅魏螜z查,如有錯(cuò)誤,只能在編譯已被宏展開(kāi)后的源程序時(shí)發(fā)現(xiàn)2022-07-07C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)與算法之鏈表(一)
鏈表是線性表的鏈?zhǔn)酱鎯?chǔ)方式。鏈表的內(nèi)存是不連續(xù)的,前一個(gè)元素存儲(chǔ)地址的下一個(gè)地址中存儲(chǔ)的不一定是下一個(gè)元素。小編今天就將帶大家深入了解一下鏈表,快來(lái)學(xué)習(xí)吧2021-12-12