官术网_书友最值得收藏!

4.7 表達式

表達式其實是一個遞歸定義的概念:

(1)一個單獨的標(biāo)識符(變量、常量、函數(shù)等)是一個表達式。

(2)由表達式和運算符按照語法規(guī)則構(gòu)成的更加復(fù)雜的表達式也是表達式。

通俗地講,表達式就是使用運算符和標(biāo)識符(操作數(shù))按照語法規(guī)則連接起來的算式,因此任何表達式都是有值的。常見的表達式有常量表達式、算術(shù)表達式、關(guān)系表達式和邏輯表達式及復(fù)合表達式。此外還有一些不常用的表達式,例如,逗號表達式、條件運算符(?:)表達式、位運算表達式,等等。

【提示4-13】: 不要把數(shù)學(xué)中的表達式與計算機語言支持的表達式相混淆。例如:

                        if(a<b<c)  //a<b<c是數(shù)學(xué)表達式而不是程序表達式

并不表示:

                        if((a<b)&&(b<c))

而是成了令人費解的if ( (a < b) < c )。

常量表達式就是全部由常量(字面常量、符號常量、枚舉常量、布爾常量等)和運算符構(gòu)成的表達式。由于常量在運行時不能改變值,所以常量表達式?jīng)]有必要等到運行時才計算,編譯器在編譯時就可以對它求值。因此,常量表達式也可以定義為:在編譯時就可以求值的表達式。

【提示4-14】: 能夠在編譯時求值的程序元素是否需要分配運行時的存儲空間呢?要看它是什么類型的程序元素。例如,基本數(shù)據(jù)類型的字面常量、枚舉常量、sizeof()、常量表達式等就不需要分配存儲空間,因此也沒有存儲類型,但是字符串常量、const常量(尤其是ADT/UDT的const對象)都要分配運行時的存儲空間,即有特定的存儲類型。

算術(shù)表達式就是由算術(shù)運算符(+、-、*、/、%、|、&等)和標(biāo)識符構(gòu)成的表達式。除了由賦值運算符(=)和算術(shù)運算符結(jié)合在一起組成的運算符外(如=、+=、-=、*=、/=、%=、|=、&=等),不要使用算術(shù)表達式作為單獨的語句,因為你并沒有保存和使用它的計算結(jié)果卻要計算機白白地耗費時間去計算它。

關(guān)系表達式就是由關(guān)系運算符(>、<、>=、<=、==、!=)和標(biāo)識符構(gòu)成的表達式,常用來構(gòu)造條件表達式。所謂條件表達式就是指示計算機執(zhí)行判斷從而有所選擇地執(zhí)行語句序列的表達式。很顯然,關(guān)系運算符都是二元運算符,兩個操作數(shù)才能產(chǎn)生關(guān)系,單獨一個操作數(shù)能和誰有關(guān)系呢?關(guān)系表達式總是返回true(非0值)或false(0)。

邏輯表達式則是由邏輯運算符(&&、||、!)和標(biāo)識符構(gòu)成的表達式,其中“!”是一元運算符。邏輯運算符也常用來構(gòu)造條件表達式。邏輯表達式總是返回true(非0值)或false(0)。

【建議4-1】: 在使用運算符“&&”的表達式中,要盡量把最有可能為false的子表達式放在“&&”的左邊;同樣在使用運算符“||”的表達式中,要盡量把最有可能為true的子表達式放在“||”的左邊。因為C++/C對邏輯表達式的判斷采取“突然死亡法”(猝死法):如果“&&”左邊的子表達式計算結(jié)果為false,則整個表達式就為false,后面的子表達式?jīng)]有必要再計算;如果“||”左邊的子表達式計算結(jié)果為true,則整個表達式就為true,因此后面的子表達式?jīng)]有必要再計算。這種方法可以提高程序的執(zhí)行效率。

由簡單表達式通過算術(shù)的、關(guān)系的和邏輯的運算組合而成的表達式就是復(fù)合表達式(混合表達式),這是我們重點討論的對象,因為它最有可能存在隱患。

允許復(fù)合表達式存在的理由是:

(1)書寫簡潔,使用簡單表達式完成相同功能需要更多周折。

(2)生成的可執(zhí)行代碼更加高效。

但要防止濫用復(fù)合表達式。

【提示4-15】: 不要編寫太復(fù)雜的復(fù)合表達式,例如:

                        i=a>=b&&c<d&&c+f<=g+h; // 復(fù)合表達式過于復(fù)雜

不要編寫多用途的復(fù)合表達式,例如:

                        d = (a = b + c) + r ;

若表達式既求a值又求d值,則應(yīng)該拆分為兩個獨立的語句:

                        a = b + c;
                        d = a + r;

需要注意的是,任何表達式都可以作為單獨的語句來用,我們叫做表達式語句。如賦值表達式也叫做賦值語句。

主站蜘蛛池模板: 肇东市| 萝北县| 高陵县| 鹤壁市| 温宿县| 山东省| 广汉市| 隆安县| 社旗县| 永平县| 龙川县| 合川市| 常德市| 固始县| 巨鹿县| 从江县| 平乐县| 寻乌县| 新宁县| 龙江县| 若尔盖县| 云安县| 黄山市| 陆丰市| 寿阳县| 辰溪县| 梁平县| 曲靖市| 景德镇市| 鸡泽县| 庆云县| 敦煌市| 抚顺市| 锡林郭勒盟| 屯昌县| 长治县| 沂水县| 来宾市| 宜宾市| 准格尔旗| 宁明县|