王燕
摘 要:C語言是應用最廣的高級程序設計語言,其語法靈活,使用便捷。文章在Turbo C環(huán)境下,提出幾種常見的編譯系統(tǒng)糾錯無法判斷的問題,分析了幾種運算符、語句結束符和ELSE等,并通過案例來比較分析程序運行結果,為廣大C語言程序學習者提供一些參考。
關鍵詞:C語言;運算符;表達式;判斷條件
C語言既有高級語言的特點,又有匯編語言的特點,因此它是應用最廣的高級程序設計語言。用它不但能編寫操作系統(tǒng)軟件,也能開發(fā)各個領域的應用軟件。目前在我國,眾多的本科和高職院校的理工科專業(yè)都把C語言作為一門必修課程。C語言可讀性強、容易維護、移植性好[1],它具有豐富的運算符與數(shù)據(jù)類型,也正因為這些,在學習C語言的過程中會出現(xiàn)很多困難和問題。
1 運算符與表達式
運算符是表示某種操作的符號,在C語言中運算符主要有:賦值運算符、算術運算符、邏輯運算符等。運算符的操作對象稱為運算數(shù),表達式是用運算符把運算數(shù)連接起來的式子[1]。只是認識運算符并不難,可是一旦將運算符與運算數(shù)結合成表達式時就很容易出現(xiàn)知識混淆產(chǎn)生問題而不知該如何入手解決。
1.1 賦值運算符“=”和關系運算符“==”
賦值運算符“=”在平常生活與基礎學習中就是“等于”的意思,但是在C語言中卻不能理解為普通的“等于”的意思,應理解為“賦予”或“給予”的意思,而作為判斷平等的“等于”在C語言中用關系運算符“==”來表示。
因為習慣性使然,在編程時經(jīng)常會出現(xiàn)誤寫“=”作為判斷的“等于”,這樣就使得所要完成的功能語句出錯,而這種錯誤是編譯系統(tǒng)無法判斷出的錯誤。
例如:下列程序語句實現(xiàn)功能是:當變量x的值,在運行過程中等于0時,輸出錯誤提示:error!
“error!”的錯誤提示,表面上兩個只有“=”與“==”不同的語句都沒有什么問題,結果都是正確的。但是,如果將int x=0變更為int x=1,運行結果卻是:第一句判斷顯示的結果還是“error!”的錯誤提示,第二句判斷沒有顯示輸出。實際上結果是很明顯的,當x=1時是不要輸出錯誤提示的,而第一句判斷仍然是“error!”的錯誤提示,這是不對的,問題出在第一句判斷句的(x=0)中的“=”,該式子表達的意思是把0賦予x,因此無論前面如何改變x的值,執(zhí)行到第一句判斷句時x的值就會被改變?yōu)?,判斷的結果永遠都是輸出錯誤提示。
1.2 邏輯或運算符“||”和邏輯與運算符“&&”
邏輯運算的結果為邏輯值,邏輯值只有兩個值:“真”和“假”,在C語言中用1表示“真”,用0表示“假”[2]。邏輯運算符的運算數(shù)一般為邏輯值,如果不是邏輯值的會自動轉為邏輯值,轉換的規(guī)則是:0為邏輯假,非0為邏輯真。
邏輯或“||”:如果兩個運算數(shù)都是假的,則結果是假的,否則結果為真;
邏輯與“&&”:如果兩個運算數(shù)都是真的,則結果是真的,否則結果為假;
邏輯或“||”和邏輯與“&&”的表達式運算規(guī)則
如果依靠死記硬背這些規(guī)則,不常用時是容易混亂出錯的。為了方便記憶可以用一個生動的比喻來幫忙,就是邏輯或“||”是一個“好好老師”而邏輯與“&&”則是一個“嚴格老師”。怎么解釋應用呢?可以這樣看:“好好老師”(或“||”)的要求比較松,只要兩個數(shù)有一個是“真”的就可以通過,結果就是“真”的;而“嚴格老師”(與“&&”)比較嚴格要求只有兩個數(shù)都是“真”的才能通過,結果才是“真”的,如果有一個是“假”的就不能通過,結果就是“假”的。
除了上表的運算規(guī)則還要注意邏輯運算規(guī)律是:從左到右的運算的?!昂煤美蠋煛保ɑ颉皘|”)在運算時如果一直是“假”的就一直向左運算,只要遇到“真”的就結束運算結果為“真”或全部操作數(shù)運算結束仍然沒有“真”結果就為“假”?!皣栏窭蠋煛保ㄅc“&&”)在運算時如果遇到“假”就結束運算結果為“假”,只有一直遇到“真”的才能繼續(xù)運算,直到所有操作數(shù)結束,結果為“真”。
這兩個運算符在C語言中是很常被使用的,在使用過程中它們還分為前綴運算和后綴運算兩種[3]。它們只作用于變量,不能用于常量和表達式,如:1++,(a+b)++都是不對的,但是自增、自減的變量是可以出現(xiàn)在表達式中的,如:a=a+b++是可以的。
運算中變量本身的自增與自減是很容易的,但是與之結合的表達式運算就會出現(xiàn)無法抉擇的情況。
例子中的x、y的值都與原來預計中的不同的原因是:
在x=j+i++中,i++是后綴引用,是先將變量i的值引用到表達式中參加運算后再自增,即x=j+i=1+1=2,i=i+1=2,而不是i=i+1=2,再x=j+i=1+2=3,注意:即使加上括號變?yōu)閤=j+(i++)運行時也是一樣的。
在y=j+++i中,本意是要做前綴運算++i的,但因與前面的算術運算符+連在一起出現(xiàn)了混亂,是應該運算y=j+(++i)還是運算y=(j++)+i。如果是y=j+(++i),表達式的結果就會是預想中i=i+1=2,y=j+i=1+2=3,但結果卻是y=2,應該是運算y=(j++)+i,自增的變量對象由i變成了j,j++也是后綴引用,因此最后的結果變?yōu)椋簓=j+i=1+1=2,j=j+1=2。在y=j+++i中變?yōu)檫\算y=(j++)+i的原因是自增和自減的運算優(yōu)先級高于算術運算符,+++放在一起就要先運算++再運算+。
情況3:
在這個表達式中變量i的自增出現(xiàn)多次,使得運算起來很復雜,這時要注意的是自增與自減運算規(guī)律是:自右向左。j=(i++)+(i++)+i+(++i);執(zhí)行的運行過程可以看成:
①從右邊的++i開始執(zhí)行,i=2;
②j=i+i+i+i,i++中的i的都是先參與表達式運算再自增,j=2+2+2+2=8;
③先后執(zhí)行兩次i++,最后i的值變?yōu)?。
執(zhí)行的過程比較復雜,不易讀懂和判斷結果,而且在不同的編譯環(huán)境下運行的結果也不一定是相同的,所以在表達式中同一個變量多次出現(xiàn)時,不宜使用變量自增、自減運算。
2 語句結束符“;”的問題
在C語言中每個語句的結束是以“;”為結束標志的[4]。語句后如果多加了一個分號并不是錯誤,可以將之看作是個不執(zhí)行任何操作的空語句,這時編譯系統(tǒng)是會發(fā)出警告提示的,提醒用戶注意并可以進行修改。但是有些時候有些特殊位置加上分號系統(tǒng)是不會提示的有問題的,如
①if(x==0)printf("error?。躰");加個分號在條件后面if(x==0);printf("error!\n");沒有細看是不易發(fā)現(xiàn)的,但是這時執(zhí)行這個句子時,無論x的值是否為0,都會輸出“error!”的語句。這次不是賦值“=”與“==”的問題,而是多出分號造成的問題。加了分號的句子應該理解為:
如果在while(x++<10)后面加個“;”,那整個句子的執(zhí)行結果將不一樣,句子原來的結果是輸出123456789,而多了分號后輸出的結果就變?yōu)檩敵鲎詈髕的值:10。僅因為一個小小的“;”影響了整個程序的效果,所以分號的使用需要注意:少了不行,多了也不行。
3 “else”問題
在C語言中else是必須和if一起配對使用的,不可以獨立使用,它的后面沒有括號即沒有條件,條件相當于默認是與if小括號的條件相反的所有條件[1]。
if... else 配對原則是:缺省{ }時,else總是和它上面離它最近的未配對的if配對。
上面例子中第一個else就與前面的if配對,第二個else就不能再與該if配對了,前面沒有其他的if可以與它配對。第二個else就被獨立出來單獨使用,else本身是沒有條件的,要否定與其配對的if的條件來做其本身的條件,這樣的else就沒有辦法真正的執(zhí)行。要正確的完成上面的程序就需要給第二個else配個if,如:
補充完整語句后,最好能夠使用縮進將相關聯(lián)的語句進行對齊,這樣便于讀程序,可以看出第一個else是與第一個if配對,它是否定x>80這個條件的即它的條件是小于等于80的執(zhí)行后面的語句。第二個else是與第二個if配對的,它的條件是小于等于60執(zhí)行后面的語句。如果這樣還是不易看懂,可以再加上大括號變?yōu)椋?/p>
這樣就比較清晰明確了。else的配對錯誤問題不僅是上面這種情況,還有很多,主要是能掌握if...else配對原則才能判斷出正確的配對情況。
總之,C語言中的靈活特點,使得學習時要靈活運用規(guī)則來掌握各種特殊情況的處理辦法。掌握好C語言為將來多方面的程序設計學習之路打下基礎。文章中實例的運算結果是在Turbo C環(huán)境下得出,不同的系統(tǒng)環(huán)境結果可能有些不同,請讀者見諒。
[參考文獻]
[1]熊錫義.C語言程序設計案例教程[M].大連:大連理工大學出版社,2009.5.
[2]龔民.C語言程序設計實用教程[M].青島:中國海洋大學出版社,2011.8.
[3]許崇,王秀紅,王洪信.C程序設計語言中兩個疑難問題的探討[J].科技與生活,2010(4):23.
[4]雷萌,趙亞妮.C語言疑惑經(jīng)驗談[J].軟件導刊,2011(3):80-82.