目錄
(一)引言
(二)利用while語句實作的循環
(三)利用do…while語句實作的循環
(四)while語句和do…while語句對比
(五)利用for語句實作的循環
(六)如何選擇循環
(一)引言
在c語言的學習中,我們會學習到循環結構的程式設計,對于循環結構我們常見的有while循環語句、do…while循環語句和for循環語句這三種,當然我們或許還會見到if和goto搭配使用的循環語句。這裡我們就簡單提一下後者這種語句。
首先,goto我們能從表面知道是“去到”這樣的意思,其實我們可以簡單的了解為“傳回”。下面我們來看一組代碼:
#include<stdio.h>
main(void)
{ int i,sum=0;
i=1;
loop:if(i<=100)
{sum+=i;
i++;
goto loop;
}
printf("%d\n",sum);
}
上述代碼是簡單的求和程式,i的初始值為1,在if條件下,完成求和,當完成循環變量增值這一步之後,若i的值仍然滿足i<=100時,則繼續執行循環體,直到不再滿足條件時,程式運作結束。(loop在if與goto構成的循環中起到語句标号的作用)。值得一提的是,該類型循環語句屬于無條件轉移語句,但是為什麼我們還要學習另外的三種語句呢?原因是因為語句标号的條件和goto語句的不友善性:
- 不能用整數作為語句标号;
- 隻能出現在goto函數當中,且唯一;
- 标号隻能加在可執行語句前面;
- 限制使用goto語句(盡量不用),goto語句在一個程式中使用多次必然會使人眼花缭亂。
下面這段代碼可以作為了解,感受一下if與goto構成的循環語句。
#include<stdio.h>
main()
{ int number,sum=0;
read_loop:scanf("%d",&number);
if(!number)goto print_sum;
sum+=number;
goto read_loop;
print_sum:printf("The total sum is %d\n",sum);
}
當然,也不能全否定goto語句,在某些特定情況下,使用goto語句還是非常友善的。下面就說一下C語言中常用的三種循環語句。
(二)利用while語句實作的循環
while語句循環的一般形式:while(expression)
statement;
statement部分可以是簡單語句,也可以是花括号括起來的複合語句。
如果表達式為真(簡單地說就是非零),執行語句部分一次,然後判斷表達式。在表達式假(0)之前,循環的判斷和執行将會一直重複。而每次循環都被成為一次疊代。
while語句循環的終止
在建構while語句中,有一個非常重要的一點,那就是保證測試值有變化,表達式最終要為假。否則,循環将會一直進行下去。例如下面這段程式:
index=1;
while(index<5);
printf("Good morning!\n");
上述程式段的運作結果是:出現無限個Good morning!。那麼原因是什麼呢?沒錯,就是因為在循環中index的值從未發生改變(一直是1)。我們簡單的對上述代碼進行修改如下:
index=1;
while(--index<5)
printf("Good morning!\n");
第二段代碼雖然改變了index的值,但是與第一段代碼相比,并沒有多大的改進,但是至少當此段代碼在index減少到其類型可容納的最小負值并變成最大正值時終止循環。
說明:
- 循環體可能一次也不執行
- 循環體可為任意類型語句
- 下列情況退出while循環:<1>條件表達式不成立(為零)
- <2>循環體内遇到break,return,goto
- 無限循環while(l)
循環體;//進入死循環
注意:使用while時,要牢記一點,隻有在測試條件後的單獨語句(簡單語句或者複合語句)才是循環語句。
(三)利用do…while語句實作的循環
do…while語句循環的一般形式:do
statement
while(expresssion);
do while語句是一種出口條件循環,即在執行完循環體後才根據測試條件決定是否再次執行環。 do while循環在執行完循環體後才執行測試條件,是以至少執行循環體一次;該類循環适用于那些至少要疊代一次的循環。比如:輸入我們在登陸賬号輸入密碼的環節。
(四)while語句和do…while語句對比
- 結論:當while後面的表達式的第一次的值為“真”時,兩種循環得到的結果相同;否則,
兩者結果不相同(指兩者具有相同的循環體的情況)。
(五)利用for語句實作的循環
for語句的一般形式:for(initialize;test;update)statement
在test為假或0之前,重複執行statement部分。
示例:
for (initialize; test; update)
printf("%d%d\n",n,2*n+1);
注意:for語句中的三個語句需要用";"分隔開。initialize表達式在執行for語句之前隻執行一次;然後對test表達式求值,如果表達式為真,則執行循環一次,接着對update表達式進行求值,并再次檢驗test表達式。for語句可能一次都不執行。
for語句和while語句的轉換:
- 可以改寫為while語句如下:
for(initialize;test;update)statement可以改寫為while語句如下:
initialize;
while test;
{
statement
update
}
二者無條件
(六)如何選擇循環
首先,需要确定選擇出口條件循環還是入口條件循環。一般而言,入口條件循環使用的比較多,理由如下:
- 一般原則是在執行循環之前進行測試條件比較好;
- 測試放在循環開頭,使程式的可讀性更高;
- 在許多應用中,要求在一開始不滿足測試條件時就直接跳過整個循環。