国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項超值服

開通VIP
零基礎(chǔ)學(xué)C語言循環(huán)與控制結(jié)構(gòu)

https://m.toutiao.com/is/eLASn2y/ 

這是一個C語言系列文章,如果是初學(xué)者的話,建議先行閱讀之前的文章。筆者也會按照章節(jié)順序發(fā)布。

本篇詳細(xì)講解循環(huán)結(jié)構(gòu)與控制結(jié)構(gòu)。對于每一種編程語言來說,這都是必不可少的結(jié)構(gòu)。

循環(huán)結(jié)構(gòu)

循環(huán)結(jié)構(gòu)是為了簡化重復(fù)工作而給出一種語句。

前面函數(shù)一文中曾提及,函數(shù)是對一種功能的封裝,以便日后直接使用這種功能??此贫际呛喕貜?fù)工作,但它們之間并非替代關(guān)系。

例如有一個需求:向文件中寫入一千萬行相同數(shù)據(jù)。

未學(xué)習(xí)循環(huán)時,只有將寫數(shù)據(jù)函數(shù)在代碼文件中寫一千萬行來完成。

這樣的代碼...

編輯代碼極慢,且生成的二進(jìn)制文件相較于同功能使用循環(huán)的代碼來說要大很多(一千萬個call指令)。

然而利用循環(huán),上述的需求三行代碼即可搞定。

來簡單看看循環(huán)結(jié)構(gòu)的執(zhí)行流程

循環(huán)結(jié)構(gòu)流程圖

通常,程序執(zhí)行到循環(huán)結(jié)構(gòu)時會先判斷循環(huán)條件是否滿足,滿足循環(huán)條件,則進(jìn)入循環(huán)內(nèi)部執(zhí)行相應(yīng)語句(上例的調(diào)用寫文件函數(shù)),然后繼續(xù)判斷循環(huán)條件(是否不足一千萬次)是否滿足,如此往復(fù),直至循環(huán)條件不滿足時,跳出循環(huán)。

在C語言中有三種循環(huán)結(jié)構(gòu):

  • while

  • do-while

  • for

while

while語句的一般形式如下:

while (循環(huán)條件) { ...//循環(huán)內(nèi)的語句}//如果循環(huán)內(nèi)只有一條語句,也可省略大括號,其實{}及其內(nèi)部語句這個整體也可以看作為一個語句,叫塊語句while (循環(huán)條件) ...;//某一條語句

關(guān)于大括號{}形成的塊語句,我將在后續(xù)作用域相關(guān)的文章中提及。

例如:

int i = 0;while (i < 10) {  ++i;}//也可寫成while (i < 10)  ++i;

do-while

我們先看下do-while的一般形式

do { ...//循環(huán)內(nèi)語句} while (循環(huán)條件);

do-while與while的差別在于,循環(huán)條件的檢查是前置還是后置。

while的執(zhí)行流程與上面的流程圖一致,即先驗證循環(huán)條件是否滿足,滿足則進(jìn)入循環(huán)。

而do-while則是先執(zhí)行循環(huán)內(nèi)語句,然后檢查循環(huán)條件,滿足循環(huán)條件則繼續(xù)執(zhí)行循環(huán)內(nèi)語句,如此往復(fù),直至循環(huán)條件不滿足時退出循環(huán)。

for

先看一下for循環(huán)結(jié)構(gòu)的一般形式

for (表達(dá)式1;表達(dá)式2;表達(dá)式3) {  ...//循環(huán)內(nèi)語句}//如果循環(huán)內(nèi)只有一條語句,可省略大括號for (表達(dá)式1;表達(dá)式2;表達(dá)式3)  ...;//某一條語句

for循環(huán)中三個表達(dá)式均可以根據(jù)需求給出或者省寫。三個表達(dá)式的含義如下:

  • 表達(dá)式1——循環(huán)的前置處理,即在檢查循環(huán)條件前被執(zhí)行,一般都是用來初始化循環(huán)條件相關(guān)的變量

  • 表達(dá)式2——循環(huán)條件,每一輪執(zhí)行循環(huán)內(nèi)語句前都要驗證表達(dá)式2的值是否為真,為真則執(zhí)行循環(huán)內(nèi)語句

  • 表達(dá)式3——循環(huán)后置處理,每一輪循環(huán)內(nèi)語句執(zhí)行后,在檢測循環(huán)條件(表達(dá)式2)前被執(zhí)行,一般用于修改循環(huán)條件相關(guān)的變量值

看個例子:

int i;for (i = 0; i < 10; ++i) { printf('%d\n', i);}

這個例子中,利用for循環(huán)讓程序執(zhí)行10次printf函數(shù)的調(diào)用,而printf將會在終端打印每一次循環(huán)時i的值。再來看幾個例子:

int i = 0;for (; i < 10; ) {  printf('%d\n', i);  ++i;}int i;for (i = 0; i < 10; ++i)  printf('%d\n', i);

這兩個例子的功能與上一個代碼區(qū)的代碼功能完全一樣,只是for循環(huán)結(jié)構(gòu)寫法略有不同而已。


控制結(jié)構(gòu)

控制結(jié)構(gòu)是用來對程序執(zhí)行流程進(jìn)行控制的,例如滿足什么條件執(zhí)行哪些語句。

看一下控制結(jié)構(gòu)的一般流程

控制結(jié)構(gòu)流程圖

程序進(jìn)入控制結(jié)構(gòu)后一般先進(jìn)行條件判斷,如果滿足條件則執(zhí)行一段語句,如果不滿足條件則不執(zhí)行語句或執(zhí)行另一段語句。這類流程一般稱為分支結(jié)構(gòu)。除卻分支結(jié)構(gòu)外,流程控制還包含一些其他功能。

在C語言中,流程控制包含如下內(nèi)容:

  • if-else

  • switch

  • break

  • continue

  • goto

if-else

這是最典型的分支結(jié)構(gòu),其形式非常直觀。

假設(shè)我們定義了如下兩個變量:

int a = 90, b = 80;

我希望a>b時向終端輸出a的值,那么代碼可以寫成:

if (a > b) {  printf('%d\n', a);}

如果同時我希望a<=b時,輸出b的值呢?

if (a > b) { printf('%d\n', a);} else { printf('%d\n', b);}

if-else語句的一般形式

if (判斷條件) {  ...//條件成立時的一段語句} else {  ...//條件不成立時的一段語句}

其中,如果{}中只有一條語句,那么大括號可以省寫。

if-else也可以嵌套,看下面這個例子:

if (a > b) { if (a-b > 10) { //潛入if判斷,a-b的值大于10則調(diào)用printf printf('%d\n', a-b);//打印a-b的值 }} else { if (a%b == 1) { //此處大括號不可省寫,因為內(nèi)部包含多于1條語句 a = 100; printf('%d\n', a%b); } else //此處大括號可以省寫,因為只有一條函數(shù)調(diào)用語句 printf('%d\n', b);}

如果我對a - b的結(jié)果有多種處理時,除了上述的嵌套,還可以怎么寫呢?

if (a-b == 10) {  printf('%d\n', a);} else if (a-b == 9) {  printf('%d\n', b);} else if (a-b == 8) {  printf('%d\n', a);} else {  printf('%d\n', b);}

這里其實也是嵌套,因為else后跟的是一條if語句,因此大括號省略。將if直接寫在else后,代碼讀起來更容易理解。

switch

如果上例中的分支條件有很多的話,則會寫出一長串if-else,這樣的代碼會很蠢笨,有沒有更優(yōu)雅的寫法呢?來一起看看switch吧,重寫上面a-b的例子:

switch (a-b) { case 10: printf('%d\n', a); break; case 9: printf('%d\n', b); break; case 8: printf('%d\n', a); break; default: printf('%d\n', b); break;}

這段代碼的含義與上面的if-else版本的完全一樣,但這樣看著是不是更簡潔一些?

來看下switch的一般形式

switch (表達(dá)式) {  case 數(shù)值1:    ...//一些語句  case 數(shù)值2: {    ...//一些語句  }  ...  default:    ...//一些語句}

表達(dá)式的值的數(shù)據(jù)類型必須為基本數(shù)據(jù)類型,且不能為指針類型。上例中,表達(dá)式a-b的值為整型。

switch中對每個分支做的都是等值判斷。

case關(guān)鍵字后跟的數(shù)值,這些數(shù)值的數(shù)據(jù)類型都必須是基本數(shù)據(jù)類型,且不能為指針類型。

上面的例子中用到了break,我們馬上就會說到。break本是用來跳出循環(huán)的,但也可用于switch結(jié)構(gòu)中。如果a-b的例子(a=90, b=80)中不加入break,那么終端輸出結(jié)果就會是:

90809080

即,會從第一個滿足等值匹配的case處執(zhí)行其中語句,并在下一個case處進(jìn)行等值判斷,直接執(zhí)行其中語句,如此直至switch中的后續(xù)分支都被執(zhí)行完。

此外,case后可以寫{}也可不寫,但這兩者的差別并不是在于case中語句數(shù)量,而是是否可以定義新的變量。

switch (a - b) {  case 10:    int c = a - b;    break;  default:    break;}

這樣的寫法是不符合語法的,case內(nèi)如果不加{},則不允許定義變量。如果一定要定義,可以如下寫:

switch (a - b) { case 10: { int c = a - b; break; } default: break;}

break

在switch中提到過,break是用來跳出循環(huán)的,我們舉個例子:

int i;for (i = 0; i < 10; ++i) {  if (i % 10 == 3)    break;}

這段代碼利用for循環(huán)結(jié)構(gòu)做10次循環(huán),但是我希望在第4次循環(huán)(i=3)時退出循環(huán)。我們可以利用if語句做判斷,然后利用break關(guān)鍵字配以分號所組成的語句跳出循環(huán)。

continue

除了跳出循環(huán),有時我們發(fā)現(xiàn)循環(huán)中有一些變量的內(nèi)容未達(dá)到預(yù)期時,希望暫時不執(zhí)行循環(huán)內(nèi)的一些語句處理。例如:

int i = 0, j = 0;for (i = 0; i < 10; ++i, ++j) {//for中的是表達(dá)式,逗號表達(dá)式也可以被應(yīng)用在此 if (j < 5) continue; j *= 10;}

這個例子中,我期望j在小于5時不要乘10,此時,我可以用if語句來判斷j的內(nèi)容,如果小于5,則用continue關(guān)鍵詞配以分號所組成的語句,讓循環(huán)中的執(zhí)行流程不繼續(xù)往下執(zhí)行,而是直接走到for的第三個表達(dá)式處理,然后流程再進(jìn)入for的第二個表達(dá)式判斷,滿足第二個表達(dá)式條件后繼續(xù)進(jìn)入for中從頭執(zhí)行語句,如此往復(fù),直到j(luò)滿足條件后,才每輪循環(huán)都執(zhí)行j *= 10;這條語句。

goto

有時,我們不在循環(huán)中時,也會有跳轉(zhuǎn)的需求,盡管這類需求極少。在日常工程中,也不推薦使用goto關(guān)鍵詞,因為濫用goto會讓代碼維護(hù)難度增加。

我們來看一個goto的例子:

int main(void){  int a = 10;again:  ++a;  if (a < 12)    goto again;  return 0;}

這里,again是一個標(biāo)號(label),其命名規(guī)則與變量命名規(guī)則一致,其后必須跟隨冒號。標(biāo)號在其所在作用域(即其所在函數(shù))內(nèi)唯一。

goto的必須配合label一同使用,因為編譯器需要知道流程跳轉(zhuǎn)到什么位置。

上面的這段代碼的含義就是,定義了整型變量a,然后a自加,判斷a的值是否小于12,小于的話,跳轉(zhuǎn)到again的位置繼續(xù)執(zhí)行其后的語句(也就是從++a;開始的部分)。如果a >= 12了,那么正常返回。

一個綜合使用的例子

#include <stdio.h>int main(void){ int i; char s[] = 'Hello World'; for (i = 0; i < sizeof(s); ++i) { if (s[i] == '\0') break; switch (s[i]) { case 'H': case 'W': printf('up-case\n'); break; case ' ': printf('blank\n'); break; default: printf('low-case\n'); break; } } return 0;}

其中,case部分如果不寫任何語句,那么流程在匹配后會繼續(xù)向下一個case前進(jìn),但不會對下一個case的值進(jìn)行等值驗證,直接進(jìn)入其語句部分執(zhí)行。


今天所提及的這些循環(huán)結(jié)構(gòu)與控制結(jié)構(gòu)都是可組合使用的。學(xué)習(xí)語言要將知識點(diǎn)融會貫通,這需要一個過程,需要多進(jìn)行嘗試,嘗試出錯不要怕,想清原因并嘗試如何修正將會大大提升編程水平與信心。

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
這樣理解C語句跟程序流就對了
控制流
零碎的小知識2 分支結(jié)構(gòu)
c語言期中考試
【Java基礎(chǔ) 3】流程控制
國二c語言題庫選擇題答案
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服