摘要:結(jié)合最小表達式的概念詳細論述了表達式的值的求解方法,并通過幾個典型實例剖析了C語言表達式的值的具體應用及分析方法。
關鍵詞:C語言;運算符;表達式
中圖分類號:TP312文獻標識碼:A文章編號:1009-3044(2008)23-965-01
Expression and Its Value of C Language
LIU Yu-li
(Electron Department,Engineering College,Linyi Normal University,Linyi 276000,China)
Abstract: This paper discussed detailedly the way of evaluation of expression with the concept of minimum expression,and analysed the concrete application and analytic method of evaluation of expression.
Key words: C language; operator; expression
1 引言
C語言是基于結(jié)構(gòu)化程序設計思想的程序設計語言,結(jié)構(gòu)化的程序由函數(shù)組成,而函數(shù)是由語句組成的。C語言中語句的標志是分號,對于一個語句而言,去掉分號后,它只是一個式子,這個式子就是表達式。
2 表達式
表達式是構(gòu)成語句的基本單位,C語言中的表達式是由運算符串聯(lián)起來的式子,所串聯(lián)的對象可以是常量、變量或函數(shù)調(diào)用。表達式的劃分是由運算符來決定的,由算術(shù)運算符串聯(lián)起來的式子稱為算術(shù)表達式;由關系運算符串聯(lián)起來的式子稱為關系表達式等。很多情況下需要討論有且只有一個運算符的表達式,因此把這種有且只有一個運算符所構(gòu)成的表達式稱為最小表達式,如a+b或!a等就是最小表達式。任何復雜的的表達式都是由最小表達式構(gòu)成的,如:a+b>c+d,這是一個關系表達式,而關系運算符的兩邊又是有算術(shù)表達式a+b和c+d組成,這兩個算術(shù)表達式都是最小表達式。最小表達式是求值的基本單位,因此在最小表達式兩邊加上括號而不影響整個表達式的值,如a+b>c+d和(a+b)>(c+d)的結(jié)果是一樣的。
對于一個復雜的表達式而言,劃分最小表達式的依據(jù)是各種運算符的優(yōu)先級和結(jié)合性,首先以表達式中優(yōu)先級最高的運算符為核心劃分出一級最小表達式,然后加上小括號運算符,小括號里面的最小表達式使用它的值進行替換,因此形成一個新的表達式,然后這個新的表達式的基礎上尋找二級最小表達式,直到將原表達式分成只有一個運算符的表達式為止,根據(jù)最后的這個運算符就能確定原表達式的類型,因此就能確定原表達式的值及其類型。
3 表達式的值
表達式的值是表達式運算后的結(jié)果,任何一個表達式都會有一個值及其類型,這個值是一個常量,也就是說任何一個最小表達式的值都是一個某種類型的常量,算術(shù)表達式的的值是整形或浮點型的常量,關系表達式或邏輯表達式的值是邏輯量0或1。如1+2是一個算術(shù)表達式,它的結(jié)果3是一個整形常量,而1+2+5這個算術(shù)表達式可以通過尋找最小表達式的的方式將其改成(1+2)+5,在運算(1+2)+5這個表達式時,小括號部分是一個最小表達式,需要使用該最小表達式的值(常量)和5進行運算,即3+5,對于這個新的表達式而言,它只有一個運算符,是一個最小表達式,我們可以根據(jù)這個最小表達式確定原表達式是一個算術(shù)表達式,它最終的結(jié)果就是一個整數(shù)常量(8)。
在分析一個表達式的時候需要將一個復雜的表達式分解成若干個最小表達式,結(jié)合表達式的值這一概念,分析表達式最終的值時可以利用表達式的值一步一步完成原表達式的求值過程。例如求10+'a'+i*f的結(jié)果,我們從最小表達式的角度分析整個表達式的運算過程。
先尋找一級表達式,*優(yōu)先級最高,則可將原表達式改成10+'a'+(3*2.0),根據(jù)類型轉(zhuǎn)換相關的知識可知,運算3*2.0時,由于2.0是double型常量,需要將3轉(zhuǎn)換成double型的常量3.0(不再顯示小數(shù)點后其它多余的0,下同),運算的結(jié)果是double型的常量6.0,因此原表達式可以轉(zhuǎn)變成10+'a'+6.0,而表達式'a'的值在做算術(shù)運算時用它的ASCII碼97,因此可以寫成10+97+6.0,這個表達式的運算符都是算術(shù)運算符,而算術(shù)運算符的結(jié)合性是自左向右的,因此它等于(10+97)+6.0,也就是107+6.0,這時原表達式就變成一個最小表達式,由于6.0是double型的常量,同樣需要將107轉(zhuǎn)換成double型的107.0,然后再和6.0運算,所得到的結(jié)果是113.0,類型是一個double型的常量。
這種分析過程和C語言編譯器求解過程可能不同,但最終結(jié)果都是一樣的,而這種分析方法可以使初學者更容易的接受復雜表達式的求解過程。
當單個的常量、變量出現(xiàn)在賦值符號的右邊是可以看作是表達式的特例,如int a,i=3;a=i;其中3是一個常量表達式,而在a=i這個表達式中i可以看成一個最小表達式的特例,賦值過程是將表達式i的值(整形常量3)賦給變量a。
“=”本身也是一個運算符,它所串聯(lián)的式子是一個賦值表達式,該表達式的值采用賦值運算符右邊的表達式的值,如a=3是一個賦值表達式,該表達式的值是采用右邊常量表達式3的值,作為該表達式的值,因此不難理解b=a=3的賦值過程。由于賦值運算符是右結(jié)合的因此可以將原表達式通過最小表達式的方式求解,即b=(a=3),小括號中是一個最小賦值表達式,該表達式的值是3,即原表達式變成b=(3)。
函數(shù)調(diào)用也是一種最小表達式,在運算時用函數(shù)的返回值作為該表達式的值,如如i=Max(a,b),該賦值運算符在運算時是將Max(a,b)的返回值(某種類型的常量)賦給i。
4 特例
自增(自減)表達式是一個特例。++a本身是一個最小表達式,該表達式的值采用變量a中的值,而不是用最小表達式的值,如(++a)*(++a),假設a=1,如果用最小表達式的概念來分析,前一個小括號中是一個最小自增表達式,該表達式的值是2,后一個小括號也是一個最小自增表達式,該表達式的值是3,理論上分析最終的結(jié)果應該是2*3=6,而在TC2.0和VC6.0下顯示的結(jié)果是9,也就是說原表達式所使用的是變量a中的值,經(jīng)過兩次自增后a中的值是3,因此結(jié)果是3*3=9。
5 結(jié)束語
C語言中的表達式與表達式的值這兩個概念非常重要,對于初學者而言,如何求解復雜表達式的值是他們的難點,從教學過程中發(fā)現(xiàn)一旦他們真正理解了最小表達式的概念后,這個問題就迎刃而解了。
參考文獻:
[1] 譚浩強.C程序設計[M].3版.北京:清華大學出版社,2005.
[2] 何欽銘,顏暉.C語言程序設計[M].杭州:浙江科技出版社,2004.
[3] 黃維通,馬力妮.C語言程序設計[M].北京:清華大學出版社,2003.