- 高質(zhì)量程序設(shè)計指南:C++/C語言
- 林銳 韓永泉編著
- 379字
- 2019-01-09 14:09:00
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;
需要注意的是,任何表達式都可以作為單獨的語句來用,我們叫做表達式語句。如賦值表達式也叫做賦值語句。
- C語言程序設(shè)計(第3版)
- JavaScript Unlocked
- Hands-On Data Structures and Algorithms with JavaScript
- 羅克韋爾ControlLogix系統(tǒng)應(yīng)用技術(shù)
- INSTANT Weka How-to
- Java虛擬機字節(jié)碼:從入門到實戰(zhàn)
- Building a Recommendation Engine with Scala
- Getting Started with SQL Server 2012 Cube Development
- 精通網(wǎng)絡(luò)視頻核心開發(fā)技術(shù)
- Java程序設(shè)計:原理與范例
- C語言課程設(shè)計
- Node.js區(qū)塊鏈開發(fā)
- WCF技術(shù)剖析(卷1)
- UML基礎(chǔ)與Rose建模實用教程(第三版)
- Puppet 5 Beginner's Guide(Third Edition)