Cwhile循環(huán)與for循環(huán)_第1頁(yè)
Cwhile循環(huán)與for循環(huán)_第2頁(yè)
Cwhile循環(huán)與for循環(huán)_第3頁(yè)
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、C while循環(huán)與for循環(huán)我們?cè)谇懊嬉呀?jīng)使用過(guò)while與for彳循環(huán)語(yǔ)句。在while循環(huán)語(yǔ)句while (表達(dá)式)語(yǔ)句中,首先求表達(dá)式的值。如果其值非0,則執(zhí)行語(yǔ)句,并再次求該表達(dá)式的值。這一循環(huán)過(guò) 程一直進(jìn)行下去,直到該表達(dá)式的值為0為止,隨后繼續(xù)執(zhí)行語(yǔ)句后面的部分。for循環(huán)語(yǔ)句;for (表達(dá)式1; 表達(dá)式2; 表達(dá)式3)語(yǔ)句它等價(jià)于下列while語(yǔ)句:表達(dá)式 1;while (表達(dá)式2) 語(yǔ)句表達(dá)式 3;但當(dāng)while或for循環(huán)語(yǔ)句中包含continue語(yǔ)句時(shí),上述二者之間就不一定等價(jià)了。我們將在3.7節(jié)中介紹continue語(yǔ)句。從語(yǔ)法角度看,for循環(huán)語(yǔ)句的3個(gè)組成部分都

2、是表達(dá)式。最常見的情況是,表達(dá)式1與表達(dá)式3是賦值表達(dá)式或函數(shù)調(diào)用,表達(dá)式2是關(guān)系表達(dá)式。這3個(gè)組成部分中的任何 部分都可以省略,但分號(hào)必須保留。如果在for語(yǔ)句中省略表達(dá)式1與表達(dá)式3,它就退化成 了while循環(huán)語(yǔ)句。如果省略測(cè)試條件,即表達(dá)式2,則認(rèn)為其值永遠(yuǎn)是真值,因此,下 列for彳循環(huán)語(yǔ)句:for (;) 是一個(gè)“無(wú)限”循環(huán)語(yǔ)句,這種語(yǔ)句需要借助其它手段(如break語(yǔ)句或return語(yǔ)句)才 能終止執(zhí)行。在設(shè)計(jì)程序時(shí)到底選用while循環(huán)語(yǔ)句還是。成循環(huán)語(yǔ)句,主要取決于程序設(shè)計(jì)人員的個(gè)人偏好。例如,在下列語(yǔ)句中:while (c = getchar() = | c = n | c

3、 = t); /* skip white space characters */因?yàn)槠渲袥]有初始化或重新初始化的操作,所以使用while循環(huán)語(yǔ)句更自然一些。如果語(yǔ)句中需要執(zhí)行簡(jiǎn)單的初始化和變量遞增,使用for語(yǔ)句更合適一些,它將循環(huán)控 制語(yǔ)句集中放在循環(huán)的開頭,結(jié)構(gòu)更緊湊、更清晰。通過(guò)下列語(yǔ)句可以很明顯地看出這一點(diǎn): for (i = 0; i n; i+)這是C語(yǔ)言處理數(shù)組前n個(gè)元素的一種習(xí)慣性用法,它類似于Fortran語(yǔ)言中的DO循環(huán)或 Pascal語(yǔ)言中的for循環(huán)。但是,這種類比并不完全準(zhǔn)確,因?yàn)樵贑語(yǔ)言中,for循環(huán)語(yǔ) 句的循環(huán)變量和上限在循環(huán)體內(nèi)可以修改,并且當(dāng)循環(huán)因某種原因終止

4、后循環(huán)變量i的值仍 然保留。因?yàn)閒or語(yǔ)句的各組成部分可以是任何表達(dá)式,所以for語(yǔ)句并不限于通過(guò)算術(shù)級(jí)數(shù) 進(jìn)行循環(huán)控制。盡管如此,牽強(qiáng)地把一些無(wú)關(guān)的計(jì)算放到for語(yǔ)句的初始化和變量遞增部 分是一種不好的程序設(shè)計(jì)風(fēng)格,該部分放置循環(huán)控制運(yùn)算更合適。作為一個(gè)較大的例子,我們來(lái)重新編寫將字符串轉(zhuǎn)換為對(duì)應(yīng)數(shù)值的 函數(shù)atoi。這里編寫的函數(shù)比第2章中的atoi函數(shù)更通用,它可以處理可選的前導(dǎo)空白符以及一個(gè)可選的加(+) 或減(-)號(hào)。(第4章將介紹函數(shù)atof,它用于對(duì)浮點(diǎn)數(shù)執(zhí)行同樣的轉(zhuǎn)換。) 下面是程序的結(jié)構(gòu),從中可以看出輸入的格式:如果有空白符的話,則跳過(guò)如果有符號(hào)的話,則讀取符號(hào)取整數(shù)部分,并

5、執(zhí)行轉(zhuǎn)換其中的每一步都對(duì)輸入數(shù)據(jù)進(jìn)行相應(yīng)的處理,并為下一步的執(zhí)行做好準(zhǔn)備。當(dāng)遇到第一個(gè)不 能轉(zhuǎn)換為數(shù)字的字符時(shí),整個(gè)處理過(guò)程終止。#include /* atoi: convert s to integer; version 2 */int atoi(char s)int i, n, sign;for (i = 0; isspace(si); i+) /* skip white space */;sign = (si = -) ? -1 : 1;if (si = + | si = -) /* skip sign */ i+;for (n = 0; isdigit(si); i+) n = 10

6、 * n + (si - 0);return sign * n;標(biāo)準(zhǔn)庫(kù)中提供了一個(gè)更完善的函數(shù)strtol,它將字符串轉(zhuǎn)換為長(zhǎng)整型數(shù)。有關(guān)函數(shù)strtol 的詳細(xì)信息,請(qǐng)參見附錄B.5節(jié)。把循環(huán)控制部分集中在一起,對(duì)于多重嵌套循環(huán),優(yōu)勢(shì)更為明顯。下面的函數(shù)是對(duì)整型 數(shù)組進(jìn)行排序的Shell排序算法。Shell排序算法是D. L. Shell于1959年發(fā)明的,其基本思想 是:先比較距離遠(yuǎn)的元素,而不是像簡(jiǎn)單交換排序算法那樣先比較相鄰的元素。這樣可以快 速減少大量的無(wú)序情況,從而減輕后續(xù)的工作。被比較的元素之間的距離逐步減少,直到減 少為1,這時(shí)排序變成了相鄰元素的互換。/* shellsort

7、: sort v0.vn-1 into increasing order */ void shellsort(int v, int n) int gap, i, j, temp;for (gap = n/2; gap 0; gap /= 2)for (i = gap; i =0 & vjvj+gap; j-=gap) temp = vj;vj = vj+gap;vj+gap = temp;該函數(shù)中包含一個(gè)三重嵌套的for循環(huán)語(yǔ)句。最外層的for語(yǔ)句控制兩個(gè)被比較元素之間的 距離,從n/2開始,逐步進(jìn)行對(duì)折,直到距離為0。中間層的for循環(huán)語(yǔ)句用于在元素間 移動(dòng)位置。最內(nèi)層的for語(yǔ)句用于比較各

8、對(duì)相距gap個(gè)位置的元素,當(dāng)這兩個(gè)元素逆序時(shí)把它 們互換過(guò)來(lái)。由于gap的值最終要遞減到1,因此所有元素最終都會(huì)位于正確的排序位置上。 注意,即使最外層for循環(huán)的控制變量不是算術(shù)級(jí)數(shù),for語(yǔ)句的書寫形式仍然沒有變, 這就說(shuō)明for語(yǔ)句具有很強(qiáng)的通用性。逗號(hào)運(yùn)算符“,”也是C語(yǔ)言優(yōu)先級(jí)最低的運(yùn)算符,在for語(yǔ)句中經(jīng)常會(huì)用到它。被逗 號(hào)分隔的一對(duì)表達(dá)式將按照從左到右的順序進(jìn)行求值,表達(dá)式右邊的操作數(shù)的類型和值即為 其結(jié)果的類型和值。這樣,在for循環(huán)語(yǔ)句中,可以將多個(gè)表達(dá)式放在各個(gè)語(yǔ)句成分中, 比如同時(shí)處理兩個(gè)循環(huán)控制變暈。我們可以通過(guò)下面的函數(shù)reverse(s)來(lái)舉例。該函數(shù)用于 倒置字符

9、串s中各個(gè)字符的位置。#include /* reverse: reverse string s in place */void reverse(char s)int c, i, j;for (i = 0, j = strlen(s)-1; i j; i+, j-) c = si;si = sj;sj = c;某些情況下的逗號(hào)并不是逗號(hào)運(yùn)算符,比如分隔函數(shù)參數(shù)的逗號(hào),分隔聲明中變量的逗號(hào)等, 這些逗號(hào)并不保證各表達(dá)式按從左至右的順序求值。應(yīng)該慎用逗號(hào)運(yùn)算符。逗號(hào)運(yùn)算符最適用于關(guān)系緊密的結(jié)構(gòu)中,比如上面的reverse函 數(shù)內(nèi)的for語(yǔ)句,對(duì)于需要在單個(gè)表達(dá)式中進(jìn)行多步計(jì)算的宏來(lái)說(shuō)也很適合。逗號(hào)表達(dá)式 還適用于reverse函數(shù)中元素的交換,這樣,元素的交換過(guò)程便可以看成是一個(gè)單步操作。for (i = 0, j = strlen(s)-1; i j; i+, j-)c = si,

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論