原立濤,李鳳玲,邸抗
摘要:選擇語句在C語言程序設(shè)計(jì)中廣泛使用,本文分析了C語言中選擇語句之間的關(guān)系,尤其對(duì)if-else語句的嵌套關(guān)系進(jìn)行了闡述說明,在分析復(fù)雜嵌套關(guān)系時(shí),強(qiáng)調(diào)else與if的對(duì)應(yīng)關(guān)系,從而可以更好地理解程序,得出準(zhǔn)確的結(jié)果。
關(guān)鍵詞:選擇;嵌套;分析
Select statement in C language program is widely used in design, this paper analyzes the C language statements in the relationship between the choice, especially for if-else statement nested relationship between explains, on the analysis of the complex nested relations, with emphasis on the corresponding shut if else, so as to better understand the program, draws accurate results.
在談及if語句嵌套時(shí),幾乎所有的教科書均給出一句經(jīng)典的說明,嵌套關(guān)系的if語句之間的配對(duì)關(guān)系的判斷方法為最里邊的if和它下面的最近的else是一對(duì)。這段話,對(duì)初學(xué)者來說不太容易理解。其實(shí),在研究if-else語句時(shí),最重要的是先解決if語句之間是并列關(guān)系還是嵌套關(guān)系。如果是并列關(guān)系,if語句之間沒有包含關(guān)系,但if語句的執(zhí)行順序會(huì)影響變量的當(dāng)前值。如果是嵌套關(guān)系,則要找到if和else之間的配對(duì)關(guān)系[1]。
由于在else語句中可以不斷地嵌套if-else語句,形成多層嵌套,因此可以將嵌套理解為從上到下逐一對(duì)if后的表達(dá)式進(jìn)行檢測(cè)。當(dāng)表達(dá)式為非0時(shí),執(zhí)行相關(guān)語句,階梯部分被越過,如果所有表達(dá)式為假,則執(zhí)行最后的else語句。這里需要注意的是,else不能省,因?yàn)槿绻麤]有else,情況可能完全不同。
看這樣一個(gè)簡單命題:
if (a
if (c= =d)y=0;
else y=1;
這三條語句是含義是什么呢?或許,我們可以得出這樣的結(jié)論,只要是滿足a小于b,并且滿足c與d相等條件的,結(jié)果y取值為零;不滿足的,y取值為1??此普_,仔細(xì)推敲起來就會(huì)發(fā)現(xiàn)問題[2]。首先看一下語句中唯一的else是哪一個(gè)if對(duì)應(yīng)的,雖然從書寫格式上看是與第一個(gè)if對(duì)應(yīng),其實(shí)不然,讓我們看一看N—S圖,就能很清楚地得到結(jié)論。所以,該語句所表達(dá)的是一個(gè)分段函數(shù),即:
很明顯,這里有關(guān)當(dāng)a大于或等于b的結(jié)果是不存在的,亦即程序壓根就沒有對(duì)這方面做出說明,因此語句中的elsey=1是針對(duì)if (c= =d)y=0;而言,如果沒有弄清關(guān)系,則會(huì)將其他結(jié)果摻雜其中,造成錯(cuò)誤。
如果再清晰一點(diǎn),我們可以在程序的后面再加上elsey=1;語句,這樣兩個(gè)else對(duì)應(yīng)各自的if就再清楚不過了。因此在嵌套的if-else語句中,如果內(nèi)嵌的if省略了else部分,可能在語義上產(chǎn)生二義性,在實(shí)際的應(yīng)用中要注意第一個(gè)else與哪一個(gè)if匹配[3]。
再比如嵌套的例子:
main()
{int a=8,b=6,c=4,d=2;
if (a>b>c)
{printf(“%d\n”,d);
else if (c-2>=d)
printf(“%d\n”,d+1);}
else
printf(“%d\n”,d+2);
}
本例中出現(xiàn)了多個(gè)if 和else,而且它們之間存在包含與被包含關(guān)系,即嵌套關(guān)系。很明顯第一個(gè)格式輸出函數(shù)到第二個(gè)格式輸出函數(shù)之間的語句是作為第一個(gè)if語句的真實(shí)存在的結(jié)果。而一旦首個(gè)if語句為假,那么只能執(zhí)行最后面的輸出語句。這里,雖說第二個(gè)else是與前面的else if離得最近,但由于其前面大括號(hào)的存在,也就使它與上面所提及的if沒有了任何的關(guān)系,它也只能與最先出現(xiàn)的if配成一對(duì),完成最外圍選擇的需要。這里還要特別注意的是第一個(gè)if語句的條件a>b>c判定的結(jié)果,往往錯(cuò)誤的產(chǎn)生,均由該條件沒有判定好而引起[4]。N—S流程如圖2所示。
綜上所述,無論是并列關(guān)系,還是嵌套關(guān)系,對(duì)于純粹的選擇語句,稍加用心是可以區(qū)分好if與else的關(guān)系的,而實(shí)際的情況是if語句中往往摻雜著關(guān)系,或是邏輯表達(dá)式,再加上自增減表達(dá)式的存在,同時(shí)對(duì)于else的缺省,以及大括號(hào)的使用,都給程序的讀取造成一定的困難。因此需要我們進(jìn)行經(jīng)常性地練習(xí),這樣才能做到熟能生巧。
參考文獻(xiàn)
[1] 李澤中.C語言程序設(shè)計(jì)[M].北京:清華大學(xué)出版,2008.
[2] 劉玉英.C語言學(xué)習(xí)指南與解題[M].北京:中國水利水電出版社,2002.
[3] 朝樂門.名師講堂——二級(jí)C語言[M].北京:人民郵電出版社,2007.
[4] 郭俊鳳.C程序設(shè)計(jì)案例教程[M].北京:清華大學(xué)出版社,2009.