程序員之程序設(shè)計(jì)知識(shí)點(diǎn)三
3.1 順序結(jié)構(gòu)
順序結(jié)構(gòu)用來(lái)描述一個(gè)計(jì)算或操作序列,表示從序列的第一個(gè)計(jì)算開(kāi)始,順序執(zhí)行序列中的每個(gè)計(jì)算,直至序列的最后一個(gè)計(jì)算。通常,一個(gè)復(fù)雜的計(jì)算過(guò)程不能用一個(gè)簡(jiǎn)單的計(jì)算來(lái)表達(dá),而需把復(fù)雜的計(jì)算描述成簡(jiǎn)單計(jì)算的序列。
1.復(fù)合語(yǔ)句
在C語(yǔ)言中,將順序執(zhí)行的語(yǔ)句序列,用花括號(hào)括起來(lái),構(gòu)成C語(yǔ)言的復(fù)合語(yǔ)句。在邏輯上視復(fù)合語(yǔ)句為單個(gè)語(yǔ)句,它也能用作其它結(jié)構(gòu)語(yǔ)句的成分語(yǔ)句。在很多場(chǎng)合,復(fù)合語(yǔ)句內(nèi)還會(huì)包含其它結(jié)構(gòu)語(yǔ)句。
2.表達(dá)式語(yǔ)句
在順序結(jié)構(gòu)中,最頻繁使用的是表達(dá)式之后接上一個(gè)分號(hào)。例如,在賦值表達(dá)式之后接上分號(hào),完成用表達(dá)式的值更新某變量,習(xí)慣稱這種表達(dá)式語(yǔ)句為賦值語(yǔ)句;在函數(shù)調(diào)用之后接上分號(hào),完成指定的計(jì)算功能,習(xí)慣稱這種表達(dá)式語(yǔ)句為函數(shù)調(diào)用語(yǔ)句。
3.2 常用輸入輸出庫(kù)函數(shù)
最基本的輸入輸出庫(kù)函數(shù)有字符輸入函數(shù)、字符輸出函數(shù)、格式輸入函數(shù)和格式輸出函數(shù)。
1.字符輸入函數(shù)
字符輸入函數(shù)getchar()的功能是從標(biāo)準(zhǔn)輸入設(shè)備上(通常是鍵盤終端)讀取一個(gè)字符。該函數(shù)沒(méi)有參數(shù),對(duì)它的每次調(diào)用,就返回下一個(gè)輸入字符的ASCII代碼值。例如,執(zhí)行語(yǔ)句
ch=getchar();
使變量ch得到輸入字符的ASCII代碼值。一般情況下,這里的變量ch為char型或int型。當(dāng)程序在輸入字符后,用ch判定輸入文件是否結(jié)束時(shí),變量ch必須是int型的。這是因?yàn)槲募Y(jié)束標(biāo)記值是-1,是int型的。程序中常用EOF表示當(dāng)前讀人字符是文件結(jié)束標(biāo)記,常量名EOF在文件Stdio.h中被定義為-1。
2.字符輸出函數(shù)
字符輸出函數(shù)ptuchar()有一個(gè)字符的ASCII代碼值參數(shù),函數(shù)調(diào)用putchar (ch)的功能是將以出值為其ASCII代碼的字符輸出到標(biāo)準(zhǔn)輸出設(shè)備(通常是終端顯示屏)上。這里ch可以是char型或int型數(shù)據(jù)。
3.格式輸入函數(shù)
格式輸入函數(shù)scanf()的作用是從標(biāo)準(zhǔn)設(shè)備讀人字符序列,按格式控制字符率所包含的格式解釋輸入字符序列,并將解釋結(jié)果存儲(chǔ)到對(duì)應(yīng)的變量中。調(diào)用格式輸入函數(shù)scanf()的一般形式為
scanf(格式控制字符串,變量地址,變量地址,……)
格式控制字符串是字符串表達(dá)式,通常是由一對(duì)雙引號(hào)括起來(lái)的字符串常量,直接用于解釋輸入字符序列。格式控制字符率可以包含:
·空白類字符(空格符或制表符),它們使輸入跳過(guò)空白類字符,直到遇到下一個(gè)非空白類字符。
·普通字符(不包括%),它們要求輸入字符流中下一個(gè)字符與它相同。
·格式轉(zhuǎn)換說(shuō)明,以字符’%’開(kāi)頭至輸入格式符結(jié)束的字符序列組成。格式轉(zhuǎn)換說(shuō)明引導(dǎo)對(duì)下一輸入字符段進(jìn)行轉(zhuǎn)換。
格式轉(zhuǎn)換說(shuō)明的一般形式為
%[*][w][h/l/L]輸入格式符
輸入格式符共有14個(gè),有12種不同輸入格式,其中大綱要求掌握的7種輸入格式符的意義見(jiàn)表3.1。用方括號(hào)括住的內(nèi)容是輸入格式修飾說(shuō)明,可以缺省,它們的意義是:
(1)*--星號(hào)(賦值抑制符),對(duì)應(yīng)的輸入數(shù)據(jù)項(xiàng)按格式要求被輸入,但結(jié)果不存儲(chǔ)。帶星號(hào)的格式轉(zhuǎn)換說(shuō)明不對(duì)應(yīng)變量地址。用它來(lái)跳過(guò)一個(gè)輸入數(shù)據(jù)項(xiàng)。
(2)--整型常數(shù)(域?qū)捳f(shuō)明),表示輸入數(shù)據(jù)項(xiàng)的字符段的有效字符數(shù)。若實(shí)際輸入字符段的字符數(shù)小于W,以實(shí)際有效字符為準(zhǔn)。
對(duì)于數(shù)值數(shù)據(jù)輸入格式來(lái)說(shuō),輸入域定義為從下一個(gè)非空白類字符起(因此可能跳過(guò)若干個(gè)空格符、制表符、換行符),到一個(gè)與數(shù)值數(shù)據(jù)相矛盾的字符,或直到輸入了指定個(gè)數(shù)的字符數(shù);對(duì)于字符率輸入格式來(lái)說(shuō),輸入域定義為從下一個(gè)非空白類字符起,輸入非空白類字符,直至遇到空白類字符,或直到輸入了指定個(gè)數(shù)的非空白字符。
(3) h/l/L長(zhǎng)度修飾符,指明輸入數(shù)據(jù)項(xiàng)的存儲(chǔ)類型。
h 修飾格式符d,o,X時(shí),表示輸入的整數(shù)按短整型存儲(chǔ)。
l 修飾格式符d,O,X時(shí),表示輸入的整數(shù)按長(zhǎng)整型存儲(chǔ)。
l 修飾格式符e,f時(shí),表示輸入的實(shí)數(shù)按double型存儲(chǔ)。
缺省時(shí),對(duì)于格式符d,o,x,表示輸入的整數(shù)按int整型存儲(chǔ);對(duì)于格式符e,f,表示輸入的實(shí)數(shù)是按float型存儲(chǔ)。
3.3 常用輸入格式符表中格式符的意義
d 輸入十進(jìn)制形式的整型數(shù)據(jù)
O 以人進(jìn)制形式輸入整型數(shù)據(jù)
X 以十六進(jìn)制形式輸入整型數(shù)據(jù)
C 輸入字符數(shù)據(jù)
S 輸入字符串
e,f 輸入實(shí)型數(shù)據(jù)
說(shuō)明:
(1)格式控制字符率之后給出的是變量地址,而不是變量名(除非是指針)。如要為整型變量n輸入數(shù)據(jù),寫成
scanf(”%d", n)是不正確的,應(yīng)寫成 scanf(”% d”,&n)
(2)如果在格式控制字符串中除格式轉(zhuǎn)換說(shuō)明和空白符之外,還有其它字符,則在輸入數(shù)據(jù)時(shí)應(yīng)輸入與這些字符相同的字符。例如,
scanf(”%d, %d’’,&i, &j)
則在為i,j輸入數(shù)據(jù)時(shí),緊接在第一個(gè)整型數(shù)據(jù)之后,需要有一個(gè)逗號(hào)字符,如輸入
1,2
是正確的;而輸入
1 2
等其它形式都是不正確的。
(3)在用”%c ”格式轉(zhuǎn)換說(shuō)明輸入字符時(shí),空白類字符和用轉(zhuǎn)義字符表示的字符都能作為有效字符輸入。要輸入一串空白類字符之后的第一個(gè)非空白類字符,可采用格式”% C”。格式字符率中的空格符使輸入跳過(guò)空白類字符到第一個(gè)非空白類字符,然后被C格式輸入。
(4)為整型變量輸入整數(shù)時(shí),若變量類型為短整型,則必須在格式符之前加長(zhǎng)度修飾說(shuō)明h;若變量類型為長(zhǎng)整型,則必須在格式符之前加長(zhǎng)度修飾說(shuō)明1。
(5)輸入數(shù)值數(shù)據(jù)時(shí),輸入字符流中的前導(dǎo)空白類字符會(huì)被自動(dòng)跳過(guò),從空白類字符后的數(shù)值數(shù)據(jù)字符開(kāi)始輸入。構(gòu)成數(shù)值數(shù)據(jù)的字符被輸入轉(zhuǎn)換成計(jì)算機(jī)的內(nèi)部表示,并存儲(chǔ)結(jié)果。
若第一個(gè)非空白類字符不能構(gòu)成數(shù)值字符,則立即結(jié)束輸入。
(6)S格式用來(lái)輸入字符串,對(duì)應(yīng)的變量地址為字符列表(數(shù)組)的首地址,該數(shù)組必須大到足以容納可能輸入的最長(zhǎng)字符串。在輸入字符流中,跳過(guò)前導(dǎo)的空白類字符,以非空白類字符開(kāi)始,以后隨的第一個(gè)空白類字符結(jié)束的非空白類字符的字符序列作為一個(gè)字符串。scanf()函數(shù)在輸入的字符序列之后自動(dòng)添加字符率結(jié)束標(biāo)記符'\0'(因此,存儲(chǔ)輸入字符序列的字符數(shù)組的長(zhǎng)度必須比實(shí)際最長(zhǎng)字符串的字符數(shù)多1)。
(7)e,f格式用未輸入實(shí)數(shù),對(duì)應(yīng)的數(shù)據(jù)存儲(chǔ)地址為實(shí)型數(shù)據(jù)存儲(chǔ)地址。如格式轉(zhuǎn)換說(shuō)明中含有長(zhǎng)度修飾說(shuō)明1,則為double型變量地址;若無(wú)長(zhǎng)度修飾說(shuō)明,則為float型變量地址。輸入數(shù)據(jù)的字符序列是由正負(fù)號(hào)(可有可無(wú))、十進(jìn)制數(shù)字串、帶小數(shù)點(diǎn)的小數(shù)部分(可有可無(wú))。以e或E開(kāi)頭的指數(shù)部分(可有可無(wú))組成。
(8)在跳過(guò)前導(dǎo)空白符后,正在輸入數(shù)值數(shù)據(jù)和字符串時(shí),遇以下情況,就認(rèn)為該數(shù)據(jù)結(jié)束:
·遇空白類字符:空白符、制表符、換行符。
·已讀人由有效字符數(shù)所指定的字符數(shù)。如”%4d多至4個(gè)數(shù)字符。
·對(duì)于輸入數(shù)值數(shù)據(jù),下一個(gè)字符不能構(gòu)成正確的數(shù)據(jù)格式。如
scanf(”%d%C%f,&i,&c,&x)
假定變量i,c,x分別為int型、char型和float型。若輸入字符列為:
123a123x. 26
則變量i為123,變量c為字符a,變量x為123.0。
(9)輸入數(shù)據(jù)時(shí),將字符流轉(zhuǎn)換成內(nèi)部表示后,存儲(chǔ)到對(duì)應(yīng)變量中。例如,
scanf(”%3d%*4d%d”,&i, &j)
如輸入字符行為
123456 78
將使變量i=123,j=78。其中數(shù)據(jù)456因賦值抑制符*的作用被跳過(guò)。一般從鍵盤讀入數(shù)據(jù),不指定輸入數(shù)據(jù)項(xiàng)的有效字符數(shù),數(shù)據(jù)項(xiàng)與數(shù)據(jù)項(xiàng)之間用空白符,或制表符,或回車符分隔。
4.格式輸出函數(shù)
格式輸出函數(shù)printf()的作用是將輸出項(xiàng)接指定的格式排版輸出到標(biāo)準(zhǔn)設(shè)備上(通常是終端顯示屏)。調(diào)用printf()函數(shù)的一般形式為
printf(格式控制字符串,表達(dá)式,表達(dá)式,……)
其中格式控制字符率是字符串表達(dá)式,通常是由用一對(duì)雙引號(hào)括起來(lái)的字符串常量。它包含三類字符:普通字符、轉(zhuǎn)義字符和格式轉(zhuǎn)換說(shuō)明,它們的作用分別如下:
(l)普通字符,要求按原樣輸出。
(2)轉(zhuǎn)義字符,要求技轉(zhuǎn)義字符的意義輸出,如’\n’,表示輸出時(shí)回車換行,’\b’表示退格等。
(3)格式轉(zhuǎn)換說(shuō)明,以字符%開(kāi)頭至格式符結(jié)束的字符列組成,其一般形式為
%[-」「+」「」[#」「W][.p][h/l/L]輸出格式符
其中用方括號(hào)括住的內(nèi)容是格式修飾說(shuō)明,可以缺?。ú怀霈F(xiàn)),如"%d"、"% 7.5f"等。每個(gè)格式轉(zhuǎn)換說(shuō)明對(duì)應(yīng)一個(gè)輸出項(xiàng),輸出項(xiàng)可以是常量、變量或表達(dá)式。格式轉(zhuǎn)換說(shuō)明的作用是將對(duì)應(yīng)輸出項(xiàng)的內(nèi)容按格式符要求產(chǎn)生出字符列,并按格式修飾說(shuō)明排版輸出。
輸出格式符共有16個(gè),有12種不同的格式,考試大綱只要求掌握表3.2所列的九種。
3.4 常用輸出格式符表中格式符的意義
d或i 整型數(shù)據(jù)以十進(jìn)制形式輸出
o 無(wú)符號(hào)整型數(shù)據(jù)以八進(jìn)制形式輸出
X 無(wú)符號(hào)整型數(shù)據(jù)以十六進(jìn)制形式輸出
U 元符號(hào)整型數(shù)據(jù)以十進(jìn)制形式輸出
C 字符的ASCll碼數(shù)據(jù),輸出對(duì)應(yīng)的字符
S 輸出字符串
f 以“整數(shù)部分.小數(shù)部分”形式輸出實(shí)型數(shù)據(jù)
e 以[-]n.nnnnne±xx輸出實(shí)型數(shù)據(jù)
g 以f或e格式輸出
說(shuō)明:
(1)x格式符同。格式符一樣,把符號(hào)位作為數(shù)的一部分輸出。對(duì)于x格式,用字符a、b、c、d、e、f(或A、B、C、D、E、F)表示9之后的六個(gè)十六進(jìn)制數(shù)字符。
(2)一個(gè)整數(shù),只要它的位在0-255范圍內(nèi),也可以用字符形式輸出,輸出以該整數(shù)為ASCII代碼的字符。反之,一個(gè)字符數(shù)據(jù)也可以用整數(shù)形式輸出,輸出該字符的ASCII代碼值。
(3)f、e和g格式符用于輸出實(shí)型數(shù)據(jù),格式轉(zhuǎn)換時(shí)有四舍五人處理。對(duì)于f格式,小數(shù)點(diǎn)后的數(shù)字個(gè)數(shù)可由格式修飾說(shuō)明p指定,若p為0,不顯示小數(shù)點(diǎn)。用e格式輸出時(shí),對(duì)于非0實(shí)數(shù),小數(shù)點(diǎn)前有一位非零數(shù)字,輸出格式中的有效位數(shù)可由格式修飾說(shuō)明p指定;字符e(或E)之后是指數(shù),指數(shù)部分至少包含兩個(gè)數(shù)字。若輸出值的絕對(duì)值不小于 1E+100,則指數(shù)部分多于兩位數(shù)字。
g格式能根據(jù)表示數(shù)據(jù)所需字符的多少自動(dòng)選擇f格式或e(或E) 格式輸出實(shí)數(shù),選擇是以輸出時(shí)所需字符數(shù)多少為標(biāo)準(zhǔn)。
格式修飾說(shuō)明有七種,教材只介紹其中四種,它們的意義分別說(shuō)明如下:
(1)W域?qū)捳f(shuō)明,W是一個(gè)十進(jìn)制整數(shù),表示輸出字段的字符數(shù)。若轉(zhuǎn)換后需要的字符個(gè)數(shù)比給出的W多,則以實(shí)際需要為準(zhǔn);若轉(zhuǎn)換后需要的字符數(shù)比W少,就在左邊用填充字符補(bǔ)足(若給出左邊對(duì)齊標(biāo)志(-),則在右邊補(bǔ)填充字符人通常用空白符作填充字符,若十進(jìn)制整數(shù)W之前有前導(dǎo)0(此0不表示以八進(jìn)制數(shù)給出字段寬度),則以字符0作填充字符。
(2)- 左對(duì)齊標(biāo)志,當(dāng)轉(zhuǎn)換后字符個(gè)數(shù)少于W時(shí),在W所限定的字段寬度內(nèi),轉(zhuǎn)換所得字符列左對(duì)齊,右邊補(bǔ)填充符。缺省時(shí),右對(duì)齊,左邊補(bǔ)填充符。
(3).p,其中p也是十進(jìn)制整數(shù)。
對(duì)于g或e格式輸出,p指明輸出精度(有效數(shù)字位數(shù)),可以缺省,缺省值依賴于系統(tǒng)的規(guī)定(下面的例子設(shè)p的缺省值為6)。
對(duì)于f格式輸出,p指明輸出字符列的小數(shù)點(diǎn)之后的數(shù)字個(gè)數(shù),可以缺省。
對(duì)于S格式輸出,p指明最多輸出字符率的前p個(gè)字符,多余截?cái)?。缺省時(shí),字符串的內(nèi)容全部輸出。
對(duì)于d.i、O、u、x和X,表示至少出現(xiàn)的數(shù)字個(gè)數(shù)。
同域?qū)捳f(shuō)明一樣,p也可以是字符*,而實(shí)際值由后面一個(gè)輸出項(xiàng)的整數(shù)值給出,若該值為負(fù)值,相當(dāng)于沒(méi)有給出p。
(4) l指明輸出項(xiàng)的類型。
長(zhǎng)度修飾符l用于格式符d、i、o、u、X,表示對(duì)應(yīng)的輸出項(xiàng)是長(zhǎng)整型或無(wú)符號(hào)長(zhǎng)整型。
以下是格式輸出的一些例子。例如,
int i=1234; long j=1234567L;
printf(”%d,%+6d,%06d,%-6d, %5ld”,i,i,i,i,j)
將輸出:
1234,+1234,00l234,1234,1234567
注意:對(duì)于long型數(shù)據(jù)輸出,必須在格式符之前有長(zhǎng)度修飾符l,表明輸出long型數(shù)據(jù)。
若 int k=045;long p=-1L;printf(”%#o,%4o,%6lo”,k,k,p)
將輸出:
045, 45, 37777777777
而printf("%#x,%4x,%6lx”,k,k,p)將輸出:
0x25, 25, FFFFFFFF
若 unsigned int u= 65535u;prinif(”%d,%4u,%ln’,u,u,p)
將輸出:
-l, 65535, 4294967295
若 char ch1= 045, ch2=’a’;printf(”%c,%-3c,%2c”,ch1,ch2,ch2)
將輸出:
%,a, a
若 char s[]==”ABCDEF’;printf(”%3s,%4.2s,%-7.4s,%.5s”,s,s,s,s)
將輸出:
ABCDEF, AB, ABCD, ABCDE
若 float f=123.4567f; double d=123.456789;
printf(”%.4f,%8.3f,%-7.2f,%.7f",f,f,f,d)
將輸出:
123.4567, 123.457, 123.46, 123.4567890
而 printf(”%.6e,%10.2e,%-10.2e,%.2e,%.9e”,f,f, f,f,d)
將輸出:
1.23457e+02, 1.2e+02,1.2e+02,l.2e+02, 1.23456789e+02
注意:實(shí)型數(shù)據(jù)的有效位數(shù),不要以為凡是打印(顯示)的數(shù)字都是準(zhǔn)確的。一般地,float型只有7位有效數(shù)字,double型有15位有效數(shù)字。實(shí)際上,因計(jì)算過(guò)程中的誤差積累,通常不能達(dá)到所說(shuō)的有效位數(shù)。
另外,要注意%g格式的特殊性,當(dāng)它選擇“整數(shù)部分.小數(shù)部分”形式時(shí),因格式修飾說(shuō)明.p在e格式中的意義是指明精度,所以p的值是整數(shù)部分位數(shù)與小數(shù)部分位數(shù)之和(不是f
格式中的小數(shù)位數(shù))。如有
float g1=12.34f,g2=0.0f;
double d=123.456789, g=123456.789;
printf("%g,%G",g1,g2);
printf("%f,%g,%g,%g,%.8g"’,g1,g1,d,g,g)
將輸出:
12.34,0
12.340000,12.34,123.457,123457,123456.79
3.5 選擇結(jié)構(gòu)
選擇結(jié)構(gòu)有單分支選擇結(jié)構(gòu)、雙分支選擇結(jié)構(gòu)和多分支選擇結(jié)構(gòu)。C語(yǔ)言提供相應(yīng)的if語(yǔ)句和switCh語(yǔ)句分別用來(lái)描述這些選擇結(jié)構(gòu)。
1.單分支選擇語(yǔ)句
單分支選擇語(yǔ)句有以下形式:
if(表達(dá)式)
語(yǔ)句
這種形式的語(yǔ)句執(zhí)行過(guò)程是:
(1)計(jì)算表達(dá)式的值;
(2)測(cè)試表達(dá)式的值。若表達(dá)式的值非0,則執(zhí)行它的成分語(yǔ)句,并結(jié)束單分支選擇的執(zhí)行;若表達(dá)式的值為0,則立即結(jié)束單分支選擇的執(zhí)行。
2.雙分支選擇語(yǔ)句
漢分支選擇語(yǔ)句有以下形式:
if(表達(dá)式)
語(yǔ)句1
else
語(yǔ)句2
雙分支選擇語(yǔ)句根據(jù)給定的選擇條件表達(dá)式值為非0或?yàn)?兩種情況,從兩個(gè)供選擇的成分語(yǔ)句中自動(dòng)選取一個(gè)成分語(yǔ)句執(zhí)行。雙分支選擇語(yǔ)句的執(zhí)行過(guò)程是:
(1)計(jì)算表達(dá)式的值;
(2)測(cè)試表達(dá)式的值并選擇執(zhí)行語(yǔ)句。若表達(dá)式的值非0,則執(zhí)行語(yǔ)句1,并結(jié)束雙分支選擇語(yǔ)句;否則執(zhí)行語(yǔ)句2,并結(jié)束雙分支選擇語(yǔ)句。
注意;無(wú)論條件表達(dá)式的值為何值,只能執(zhí)行語(yǔ)句1或語(yǔ)句2中的一個(gè)。當(dāng)雙分文選擇語(yǔ)句中的else之后的語(yǔ)句2為空語(yǔ)句時(shí),就變成單分支選擇語(yǔ)句。
單分文選擇語(yǔ)句和雙分支選擇語(yǔ)句統(tǒng)稱且語(yǔ)句。在if語(yǔ)句中的語(yǔ)句、語(yǔ)句1和語(yǔ)句2可以是任何語(yǔ)句。當(dāng)它們中的某一個(gè)需用語(yǔ)句序列描述時(shí),必須將這語(yǔ)句序列寫成復(fù)合語(yǔ)句。當(dāng)它們中的某一個(gè)又是if語(yǔ)句時(shí),就呈現(xiàn)嵌套的if語(yǔ)句形式。這時(shí)應(yīng)注意else與if的對(duì)應(yīng)關(guān)系。C語(yǔ)言約定else總是與它前面最接近的if對(duì)應(yīng)。
為正確書(shū)寫if語(yǔ)句,特別說(shuō)明以下幾點(diǎn):
(1)若if語(yǔ)句中的語(yǔ)句、語(yǔ)句1、語(yǔ)句2是一個(gè)簡(jiǎn)單語(yǔ)句,則這些簡(jiǎn)單語(yǔ)句之后會(huì)有一個(gè)分號(hào),這是C語(yǔ)言對(duì)這些簡(jiǎn)單語(yǔ)句的要求。
(2)若if語(yǔ)句中的語(yǔ)句、語(yǔ)句l、語(yǔ)句2要用語(yǔ)句序列(即為順序結(jié)構(gòu))來(lái)實(shí)現(xiàn),則必須將它們改寫成復(fù)合語(yǔ)句,即邏輯上把它們變成一個(gè)語(yǔ)句。
(3) 在if語(yǔ)句中,每個(gè)else總要與它前面的if對(duì)應(yīng),不可能出現(xiàn)沒(méi)有對(duì)應(yīng)if的else。
多分支選擇語(yǔ)句
多分支選擇結(jié)構(gòu)通常有 n(>2)個(gè)不同情況和 n+1個(gè)供選擇的分支。多分支選擇結(jié)構(gòu)也可用前敘述的嵌套if語(yǔ)句來(lái)描述,但因if語(yǔ)句嵌套深度太多不便于程序編寫,也不便于理解,為此C語(yǔ)言專門提供了一種實(shí)現(xiàn)多分支選擇結(jié)構(gòu)的語(yǔ)句,這就是switCh語(yǔ)句。它的一般形式是:
switeh(表達(dá)式){
case常量表達(dá)式 1:語(yǔ)句序列 1
case常量表達(dá)式 1:語(yǔ)句序列 2
case常量表達(dá)式 n:語(yǔ)句序列 n
defalt:語(yǔ)句序列 n+1
}
對(duì)switeh語(yǔ)句需說(shuō)明以下幾點(diǎn):
(1)switch后面括號(hào)內(nèi)的表達(dá)式只限于是整型表達(dá)式或字符型表達(dá)式或枚舉型表達(dá)式。
(2)case后的常量表達(dá)式稱為情況前綴,要求所有常量表達(dá)式的值互不相同,并與switch后面括號(hào)內(nèi)的表達(dá)式值的類型相一致。
(3)語(yǔ)句序列由任意條合法的C語(yǔ)句構(gòu)成,也可以沒(méi)有語(yǔ)句。
(4)情況前綴default可以缺省,但至多出現(xiàn)一次,習(xí)慣總是將它寫在全部情況前綴之后,如有必要也可寫在某case之前。
switch語(yǔ)句的執(zhí)行過(guò)程解釋如下:
先計(jì)算表達(dá)式的值,以該值依次與各case之后的常量表達(dá)式的值比較,按下列規(guī)則,選擇執(zhí)行的入口:
如果表達(dá)式的值等于某個(gè)常量表達(dá)式的值,switch語(yǔ)句就從該常量表達(dá)式之后的語(yǔ)句序列的第一個(gè)語(yǔ)句開(kāi)始執(zhí)行,然后一直向下執(zhí)行,或自動(dòng)依次進(jìn)入后繼常量表達(dá)式之后的語(yǔ)句序列繼續(xù)執(zhí)行(如沒(méi)有 break語(yǔ)句),或執(zhí)行完語(yǔ)句序列 n+1,結(jié)束 switch語(yǔ)句的執(zhí)行;或在執(zhí)行某個(gè)語(yǔ)句序列過(guò)程中遇到轉(zhuǎn)出該switch語(yǔ)句的語(yǔ)句(如break語(yǔ)句),就停止向下執(zhí)行,結(jié)束switch語(yǔ)句的執(zhí)行。
如果沒(méi)有相匹配的常量表達(dá)式,就從以default為情況前綴的語(yǔ)句序列開(kāi)始執(zhí)行。
如果沒(méi)有相匹配的常量表達(dá)式,也沒(méi)有defaul情況前綴,則該switch語(yǔ)句的這次執(zhí)行立即結(jié)束。
由上述解釋可知,“case常量表達(dá)式”只是起語(yǔ)句序列入口的作用。在執(zhí)行switch語(yǔ)句時(shí),根據(jù)switch之后的表達(dá)式的值找到與該值匹配的入口,就從此人口處開(kāi)始執(zhí)行,只要未遇到轉(zhuǎn)出該switch語(yǔ)句的break語(yǔ)句或goto語(yǔ)句,就一直向下執(zhí)行,也不再理會(huì)經(jīng)過(guò)的case后的常量表達(dá)式。
如果要使各種情況互相排斥,僅執(zhí)行各case所對(duì)應(yīng)的語(yǔ)句序列,最常用的辦法是使用break語(yǔ)句,各語(yǔ)句序列都以break語(yǔ)句結(jié)束。在switch語(yǔ)句中,執(zhí)行break語(yǔ)句將使控制轉(zhuǎn)向switch語(yǔ)句的后繼語(yǔ)句。
由于switch語(yǔ)句的表達(dá)式不允許是實(shí)型的,當(dāng)應(yīng)用于實(shí)型值選擇情況時(shí),通常需作以下處理:將實(shí)表達(dá)式乘上一個(gè)適當(dāng)?shù)谋壤蜃樱馆^大的實(shí)表達(dá)式值映照到一個(gè)較小的范圍上,然后再將它轉(zhuǎn)換到整型。
循環(huán)結(jié)構(gòu)
循環(huán)計(jì)算用循環(huán)結(jié)構(gòu)來(lái)描述。C語(yǔ)言提供三種描述不同循環(huán)結(jié)構(gòu)的語(yǔ)句,它們是while語(yǔ)句、do-while語(yǔ)句和for語(yǔ)句。
1.while語(yǔ)句
while語(yǔ)句用來(lái)描述while型循環(huán)結(jié)構(gòu),它的一般形式為
while(表達(dá)式)
語(yǔ)句
while語(yǔ)句的執(zhí)行過(guò)程是:
(1)計(jì)算while之后的表達(dá)式的值;
(2)測(cè)試表達(dá)式的值,當(dāng)值為非 0時(shí),轉(zhuǎn)步驟 3;如值為 0,則結(jié)束while語(yǔ)句;
(3)執(zhí)行while語(yǔ)句的循環(huán)體,并轉(zhuǎn)步驟1(從而構(gòu)成循環(huán))。
一般來(lái)說(shuō),為使while語(yǔ)句的執(zhí)行能正常結(jié)束,如控制循環(huán)的條件表達(dá)式包含有變量,循環(huán)體的執(zhí)行應(yīng)能更新這些變量的值,使表達(dá)式的值會(huì)變?yōu)?。有時(shí),很難直接寫出while后的條件,這時(shí)可以簡(jiǎn)單地寫上 1,而在循環(huán)體中含有當(dāng)某條件滿足時(shí),執(zhí)行如 break語(yǔ)句那樣的控制轉(zhuǎn)移語(yǔ)句,使控制跳出while循環(huán),即呈以下結(jié)構(gòu)形式:
while(1){
...
if(表達(dá)式)break;
...
}:
2.do-while語(yǔ)句
do-while語(yǔ)句用來(lái)描述do-while型循環(huán)結(jié)構(gòu),它的一般形式為;
do
語(yǔ)句
while(表達(dá)式);
其中的語(yǔ)句是do-while語(yǔ)句的循環(huán)體。do-while語(yǔ)句的執(zhí)行過(guò)程是:
(1)執(zhí)行do-while語(yǔ)句的循環(huán)體;
(2)求 while之后的表達(dá)式的值;
(3)測(cè)試表達(dá)式的值,當(dāng)值為非0,轉(zhuǎn)步驟1(從而構(gòu)成循環(huán));如值為0,則結(jié)束do-while語(yǔ)句。
與while語(yǔ)句一樣,當(dāng)循環(huán)體由多個(gè)語(yǔ)句組成時(shí),必須把它們書(shū)寫成復(fù)合語(yǔ)句。有些用while語(yǔ)句描述的循環(huán)計(jì)算,也能用do-while語(yǔ)句描述。然而,并非總是如此。兩者的重要區(qū)別在于:執(zhí)行循環(huán)體時(shí),對(duì)作為循環(huán)條件的表達(dá)式的求值和測(cè)試的時(shí)間不同。while語(yǔ)句對(duì)作為循環(huán)條件的表達(dá)式求值和測(cè)試在執(zhí)行循環(huán)體之前,而do-While語(yǔ)句對(duì)作為循環(huán)條件的表達(dá)式求值和測(cè)試在執(zhí)行循環(huán)體之后。對(duì)于do-while語(yǔ)句,它的循環(huán)體至少被執(zhí)行一次,而while語(yǔ)句的循環(huán)體在作為循環(huán)條件的表達(dá)式值一開(kāi)始就為0的情況下,就一次也未被執(zhí)行。如能保證while語(yǔ)句中的作為循環(huán)條件的表達(dá)式在第一次被求值后,總是非0,則把該循環(huán)條件移至循環(huán)體執(zhí)行之后求值和測(cè)試,能起同樣的控制作用。在這種情況下,while語(yǔ)句就能改寫成如while語(yǔ)句。如 while語(yǔ)句中的作為循環(huán)條件的表達(dá)式值可能初次求值就為 0時(shí),則它不能簡(jiǎn)單地改寫成do-while語(yǔ)句。另外要特別指出,分號(hào)是do-while語(yǔ)句的結(jié)束符,不能省略。
for語(yǔ)句
for語(yǔ)句是C語(yǔ)言中最靈活、使用最廣泛的循環(huán)結(jié)構(gòu)語(yǔ)句。如以最一般意義下考慮循環(huán),一個(gè)完整的循環(huán)應(yīng)包含對(duì)有關(guān)變量賦初值部分、控制循環(huán)的條件、一個(gè)要循環(huán)計(jì)算的操作、每次循環(huán)后對(duì)有關(guān)變量的修正等四部分組成。拉語(yǔ)句就是從這一般意義下表達(dá)循環(huán)結(jié)構(gòu)的語(yǔ)
句。for語(yǔ)句的一般形式為
for(表達(dá)式1;表達(dá)式2;表達(dá)式3)
語(yǔ)句
其中的語(yǔ)句是for語(yǔ)句的循環(huán)體。輸語(yǔ)句的執(zhí)行過(guò)程是:
(1)計(jì)算表達(dá)式1;
(2)計(jì)算表達(dá)式 2的值,并測(cè)試其值為 0或非 0。若值為非 0,轉(zhuǎn)步驟 3;否則結(jié)束 for語(yǔ)句;
(3)執(zhí)行循環(huán)體;
(4)計(jì)算表達(dá)式3;
(5)轉(zhuǎn)向步驟2。
for語(yǔ)句的一般形式也可等價(jià)地用以下形式的while語(yǔ)句來(lái)表達(dá):
表達(dá)式1;
while(表達(dá)式2) {
語(yǔ)句
表達(dá)式3;
}
由for語(yǔ)句的執(zhí)行過(guò)程可知,for語(yǔ)句的表達(dá)式1的作用是對(duì)控制循環(huán)的有關(guān)變量賦初值;表達(dá)式2是控制循環(huán)的條件;表達(dá)式3用于修正有關(guān)變量;語(yǔ)句是循環(huán)體。所以for語(yǔ)句按各部分的功能,可以形象地寫成以下形式:
for(賦初值的表達(dá)式;控制循環(huán)條件的表達(dá)式;修正變量的表達(dá)式)
完成循環(huán)計(jì)算的語(yǔ)句
正確使用for語(yǔ)句,需注意以下幾種情況:
(1) for語(yǔ)句的一般形式中,表達(dá)式1、表達(dá)式2和表達(dá)式3都可以省略。如表達(dá)式1省略,表示該for語(yǔ)句沒(méi)有賦初值部分,或前面的程序段已為有關(guān)變量賦了初值,或確實(shí)沒(méi)有特別的初值;如表達(dá)式2省略,表示循環(huán)條件永遠(yuǎn)為真,可能循環(huán)體內(nèi)有控制轉(zhuǎn)移語(yǔ)句轉(zhuǎn)出缺語(yǔ)句;表達(dá)式3省略,表示沒(méi)有修正部分,對(duì)變量的修正已在循環(huán)體內(nèi)一起完成。不管表達(dá)式1、表達(dá)式2和表達(dá)式3省略情況如何,其中兩個(gè)分號(hào)都不能省略。對(duì)于三個(gè)表達(dá)式都省略情況,for語(yǔ)句呈以下形式:
for(;;)
語(yǔ)句
(2)表達(dá)式l、表達(dá)式2和表達(dá)式3都可包含逗號(hào)運(yùn)算符由多個(gè)表達(dá)式組成。
4. break語(yǔ)句
break語(yǔ)句除能用于switch語(yǔ)句外,還常用于循環(huán)語(yǔ)句中。執(zhí)行循環(huán)結(jié)構(gòu)中的break語(yǔ)句,控制就從包含它的循環(huán)結(jié)構(gòu)中退出。break語(yǔ)句通常與if語(yǔ)句結(jié)合,構(gòu)成一個(gè)結(jié)束循環(huán)的條件。
5.continue語(yǔ)句
continue語(yǔ)句只用于循環(huán)語(yǔ)句中。通常復(fù)雜的循環(huán)計(jì)算中,循環(huán)語(yǔ)句的循環(huán)體是一個(gè)語(yǔ)句序列,中間會(huì)有一個(gè)包含continue語(yǔ)句的且語(yǔ)句。當(dāng)指定的條件成立時(shí),continue語(yǔ)句就被執(zhí)行,這時(shí)continue語(yǔ)句之后的語(yǔ)句就不再執(zhí)行,控制立即進(jìn)入下一輪循環(huán)。
6. 語(yǔ)句標(biāo)號(hào)和goto語(yǔ)句
C程序的語(yǔ)句之前都可插入標(biāo)識(shí)符和冒號(hào),該標(biāo)識(shí)符即為其后語(yǔ)句的標(biāo)號(hào)。如
strat:X= 0;
標(biāo)識(shí)符Start就是語(yǔ)句“x=0;”的標(biāo)號(hào)。
goto語(yǔ)句(goto標(biāo)號(hào);)是一種無(wú)條件轉(zhuǎn)移語(yǔ)句,其意義是將程序的控制轉(zhuǎn)到以所指定的標(biāo)號(hào)命名的語(yǔ)句處。goto語(yǔ)句通常出現(xiàn)在if語(yǔ)句內(nèi),實(shí)現(xiàn)當(dāng)某種條件出現(xiàn)時(shí),需要改變正常的順序執(zhí)行控制流程。由于goto語(yǔ)句過(guò)份的隨意使用會(huì)給程序的理解帶來(lái)很大的困難,所以一般強(qiáng)調(diào)不使用goto語(yǔ)句來(lái)編程。只有當(dāng)一個(gè)多重循環(huán)的最內(nèi)層,當(dāng)發(fā)現(xiàn)某種特別的情況需要結(jié)束整個(gè)多重循環(huán),這時(shí)可用goto語(yǔ)句讓程序執(zhí)行從最內(nèi)層直接轉(zhuǎn)到外層循環(huán)之外。注意,break語(yǔ)句只能跳出包含它的一層循環(huán)。
7.用goto語(yǔ)句構(gòu)成循環(huán)
在早先非結(jié)構(gòu)化程序設(shè)計(jì)中,由于語(yǔ)言提供的控制結(jié)構(gòu)的結(jié)構(gòu)性差,常用goto語(yǔ)句構(gòu)成循環(huán)。但在結(jié)構(gòu)化程序中,不再用goto語(yǔ)句構(gòu)成循環(huán)。考生掌握這個(gè)知識(shí)是要求考生能將goto語(yǔ)句構(gòu)成的循環(huán)改寫成結(jié)構(gòu)化控制結(jié)構(gòu)描述的循環(huán)。
【編輯推薦】