版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、c語言編程技巧語言編程技巧之二之二 表達式和基本語句表達式和基本語句 常量和宏變量常量和宏變量 第4章 表達式和基本語句 w 表達式和語句都屬于c+/c的短語結(jié)構(gòu)語法。 w 很多程序員用隱含錯誤的方式寫表達式和基本語句。 w 主要討論:if、for、while、goto、switch w 4.1 運算符的優(yōu)先級 w 4.2 復(fù)合表達式 w 4.3 if 語句 w 4.4 循環(huán)語句的效率 w 4.5 for 語句的循環(huán)控制變量 w 4.6 switch語句 w 4.7 goto 語句 4.1 運算符的優(yōu)先級 w c+/c語言的運算符有數(shù)十個,運算符的優(yōu)先級與結(jié) 合律如表4-1所示。 w 一元運算
2、符 + - * 的優(yōu)先級高于對應(yīng)的二元運算符。 w 【建議4-1】如果代碼行中的運算符比較多,用括號 確定表達式的操作順序,避免使用默認(rèn)的優(yōu)先級。 w 為了防止產(chǎn)生歧義并提高可讀性,應(yīng)當(dāng)用括號確定表 達式的操作順序。 word = (high n = pthisjring-m = pthisjring-k =0; /語句太長,不清晰 pthisjring-n = 0;/這樣語句排列整齊明確 pthisjring-m = 0; pthisjring-k = 0; w 【建議4-2】不要編寫太復(fù)雜的復(fù)合表達式。 w 【建議4-3】不要有多用途的復(fù)合表達式。 w 6 i = a = b /上式的含義
3、 w 【建議4-4】不要把程序中的復(fù)合表達式與“真正的 數(shù)學(xué)表達式”混淆。 w if (a b c) / a b c是數(shù)學(xué)表達式而不是程序表達 式并不表示 w if (ab) if (p = null) / p與null顯式比較,強調(diào)p是指針變量 if (p != null) / p與null顯式比較,強調(diào)p是指針變量 if (p = 0) / 容易讓人誤解p是整型變量 if (p != 0) if (p) / 容易讓人誤解p是布爾變量 if (!p) 4.3.5 對if語句的補充說明 w 有時候我們可能會看到 if (null = p) 這樣古怪的格 式。不是程序?qū)戝e了,是程序員為了防止將
4、if (p= null) 誤寫成 if (p = null),而有意把p和null顛 倒。 if (null = p) / if (p = null) /是合法的,但是含義與程序員設(shè)想不同 if (null = p) /是錯誤的 w 程序中有時會遇到if/else/return的組合,應(yīng)該將如下不 良風(fēng)格的程序 if (condition) return x; return y; if (condition) return x; else return y; return (condition ? x : y); /更加簡練 4.4 循環(huán)語句的效率 w c+/c循環(huán)語句中,for語句使用頻率最
5、高,while語句 其次,do語句很少用。 w 提高循環(huán)體效率的基本辦法是降低循環(huán)體的復(fù)雜性。 w 【建議4-9】在多重循環(huán)中,如果有可能,應(yīng)當(dāng)將最 長的循環(huán)放在最內(nèi)層,最短的循環(huán)放在最外層,以減 少cpu跨切循環(huán)層的次數(shù)。 for (row=0; row100; row+) for ( col=0; col5; col+ ) sum = sum + arowcol; /低效率:長循環(huán)在最外層 for (col=0; col5; col+ ) for (row=0; row100; row+) sum = sum + arowcol; /高效率:長循環(huán)在最內(nèi)層 w 【建議4-10】如果循環(huán)體內(nèi)
6、存在邏輯判斷,并且循環(huán) 次數(shù)很大,宜將邏輯判斷移到循環(huán)體的外面。 for (i=0; in; i+) if (condition) /執(zhí)行了n次邏輯判斷 dosomething(); else dootherthing(); /效率低但程序簡潔 if (condition) /執(zhí)行了1次邏輯判斷 for (i=0; in; i+) dosomething(); else for (i=0; in; i+) dootherthing(); /效率高但程序不簡潔 4.5 for 語句的循環(huán)控制變量 w 【建議4-11】不可在for 循環(huán)體內(nèi)修改循環(huán)變量,防止 for 循環(huán)失去控制。 w 【建議4-
7、12】建議for語句的循環(huán)控制變量的取值采用 “半開半閉區(qū)間”寫法。 for (int x=0; xn; x+) /循環(huán)變量屬于半開半閉區(qū)間 for (int x=0; x=n-1; x+) /循環(huán)變量屬于閉區(qū)間 4.6 switch語句 w switch語句存在的理由 switch是多分支選擇語句,而if語句只有兩個分支 可供選擇。 用嵌套的if語句來實現(xiàn)多分支選擇,但那樣的程序 冗長難讀。 /switch語句的基本格式 switch (variable) case value1 : break; /不要忘了加break case value2 : break; /不要忘了加break de
8、fault : /不要忘記default分支 break; w 【建議4-13】每個case語句的結(jié)尾不要忘了加break, 否則將導(dǎo)致多個分支重疊(除非有意使多個分支重 疊)。 w 【建議4-14】不要忘記最后那個default分支。即使程 序真的不需要default處理,也應(yīng)該保留語句 default : break; 這樣做并非多此一舉,而是為了防止別人誤以 為你忘了default處理。 21 status bracketsmatch() char ch; sqstack s; initstack(s); ch = getchar(); / 從終端接一個字符 int flag=1; wh
9、ile (flag break; case : push(s, ch); break; case ): pop(s, ch); if (ch != ( ) flag = 0; break; case : pop(s, ch); if (ch != ) flag = 0; break; default : ch = getchar(); / 從終端接收下一個字符 /while destroystack(s); if(flag) return true; else return false; /end of function bracketsmatch() 4.7 goto語句 w 自從提倡結(jié)構(gòu)化
10、設(shè)計以來,goto就成了有爭議的語句。 首先,由于goto語句可以靈活跳轉(zhuǎn),如果不加限制, 它的確會破壞結(jié)構(gòu)化設(shè)計風(fēng)格。 w 其次,goto語句經(jīng)常帶來錯誤或隱患。它可能跳過了 某些對象的構(gòu)造、變量的初始化、重要的計算等語句, goto state; string s1, s2; / 被goto跳過 int sum = 0; / 被goto跳過 state: 5 常量和宏 w 常量是一種標(biāo)識符,它的值在運行期間恒定不變。 w c和c+語言用 #define來定義常量(稱為宏常量)。 w c+語言還可以用const來定義常量(稱為const常量) w 5.1 為什么需要常量 w 5.2 cons
11、t 與宏常量的比較 w 5.3 常量定義建議 w 5.4 static 變量 w 5.5 宏定義#define w 5.6 宏函數(shù) w 5.7 宏函數(shù)還是inline函數(shù)? w 【建議5-1】 盡量使用含義直觀的常量來表示那些將 在程序中多次出現(xiàn)的數(shù)字或字符串。 24 #define max 100 /* c語言的宏常量 */ const int max = 100; / c+ 語言的const常量 const float pi = 3.14159; / c+ 語言的const常量 5.1 為什么需要常量 w 如果不使用常量,直接在程序中填寫數(shù)字或字符串, 將會有什么麻煩? w (1) 程序的
12、可讀性(可理解性)變差。程序員自己 會忘記那些數(shù)字或字符串是什么意思,用戶則更加不 知它們從何處來、表示什么。 w (2) 在程序的很多地方輸入同樣的數(shù)字或字符串, 難保不發(fā)生書寫錯誤。 w (3) 如果要修改數(shù)字或字符串,則會在很多地方改 動,既麻煩又容易出錯。 5.2 const 與 宏常量的比較 w 用const來定義常量,比用 #define定義的宏常量更優(yōu) 越: w (1) const常量有數(shù)據(jù)類型,而宏常量沒有數(shù)據(jù)類型。 編譯器可以對前者進行類型安全檢查。而對后者只進 行字符替換,沒有類型安全檢查,并且在字符替換可 能會產(chǎn)生意料不到的錯誤(邊際效應(yīng))。 w (2) 有些集成化的調(diào)試
13、工具可以對const常量進行調(diào) 試,但是不能對宏常量進行調(diào)試。 w 【建議5-2-1】在c+ 程序中只使用const常量而不使 用宏常量,即const常量完全取代宏常量。 5.3 常量定義建議 w 【建議5-3-1】需要對外公開的常量放在頭文件中,不 需要對外公開的常量放在定義文件的頭部。為便于管 理,可以把不同模塊的常量集中存放在一個公共的頭 文件中。 w 【建議5-3-2】如果某一常量與其它常量密切相關(guān),應(yīng) 在定義中包含這種關(guān)系,而不應(yīng)給出一些孤立的值。 w 例如: w const float radius = 100; w const float diameter = radius *
14、2; 5.4 static 變量 w 程序存儲空間可以分為三部分 w static 變量 (1) 靜態(tài)局部變量屬于靜態(tài)存儲類別,在靜態(tài)存儲 區(qū)內(nèi)分配存儲單元。在程序整個運行期間都不釋 放。 (2) 對靜態(tài)局部變量是在編譯時賦初值的,即只賦 初值一次,在程序運行時它已有初值。以后每次 調(diào)用函數(shù)時不再重新賦初值而只是保留上次函數(shù) 調(diào)用結(jié)束時的值。 28 程序區(qū)程序區(qū) 靜態(tài)存儲區(qū)靜態(tài)存儲區(qū) 動態(tài)存儲區(qū)動態(tài)存儲區(qū) static 變量 29 void varfunc(); void varfunc() int var = 0; /var 動態(tài)變量 static int static_var = 0; /
15、 static_var 靜態(tài)變量 printf(40:var equal %d n,var); printf(40:static var equal %d n,static_var); printf(n); var+; static_var+; void main() int i; for(i=0;ib?a:b) int x=1, y = 3, z = 4; x = max(y, z); /相當(dāng)于相當(dāng)于x= (yz?y:z); x = max(y+x, z); /相當(dāng)于相當(dāng)于x= (y+xz?y+x:z); #define max(a, b) (a)(b)?(a):(b) int x=1, y
16、 = 3, z = 4; x = max(y+x, z); /相當(dāng)于相當(dāng)于x= (y+x)(z)?(y):(z); 33 #define true 1 #define false 0 #define sq(x) (x)*(x) void main() int num; int again=1; printf(40: program will stop if input value less than 50.n); while(again) printf(40:please input number=); scanf(%d, printf(40:the square for this numbe
17、r is %d n, sq(num); if(num=50) again=true; else again=false; 34 #define eq(a, b) (a) = = (b) #define lt(a, b) (a) (b) #define lq(a, b) (a) = (b) int search_bin ( sstable st, keytype key ) low = 1; high = st.length; / 置區(qū)間初值置區(qū)間初值 while (low = high) mid = (low + high) / 2; if (eq (key , st.elemmid.key)
18、 ) return mid; / 找到待查元素找到待查元素 else if ( lt (key , st.elemmid.key) ) high = mid - 1; / 在前半?yún)^(qū)間查找在前半?yún)^(qū)間查找 else low = mid + 1; / 在后半?yún)^(qū)間查找在后半?yún)^(qū)間查找 return 0; / 順序表中不存在待查元素順序表中不存在待查元素 / search_bin #define eq(a, b) (!strcmp(a), (b) #define lt(a, b) (strcmp(a), (b) 0) #define lq(a, b) (strcmp(a), (b) = 0) 5.7 宏函數(shù)還是宏函數(shù)還是inline函數(shù)?函數(shù)? 35 #define f(x) x*x void main() int x =2; printf(“%d”,f(x); printf(“%d”,f(x+1); o
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年珠寶首飾定制定制合同
- 2025版民宿院落特許經(jīng)營授權(quán)合同3篇
- 2024年度物流服務(wù)外包合同補充協(xié)議:物流成本控制3篇
- 2024年特別版:九州大學(xué)管理學(xué)研究生項目合同
- 2025版新能源儲能項目合同標(biāo)的補充協(xié)議2篇
- 2025版跨境電商出口退稅貨款結(jié)算與稅收籌劃合同3篇
- 2024年汽車4S店休息區(qū)餐飲服務(wù)合同
- 2024年購房合同范本(官方版)
- 2025版011號虛擬現(xiàn)實教育與培訓(xùn)合同3篇
- 2024年甲方委托乙方進行員工培訓(xùn)及管理提升合同
- 幕墻工程專項施工方案審批流程
- 新視野英語教程(第四版)讀寫教程1 期末測試卷 測試卷A
- 【施工組織方案】框架結(jié)構(gòu)施工組織設(shè)計
- 人工智能背景下高校智慧思政建設(shè)
- 高考物理復(fù)習(xí)講義第88講 電磁感應(yīng)中的雙桿模型(解析版)
- 市級課題研究成果案例一等獎《“教研訓(xùn)一體化”混合式培訓(xùn)模式的建構(gòu)與實踐》
- 老年人的心肺復(fù)蘇課件
- 貴州省畢節(jié)市威寧彝族回族苗族自治縣2023-2024學(xué)年八年級上學(xué)期期末數(shù)學(xué)試題(含答案)
- 6.2密度說課課件(23)2022-2023學(xué)年人教版物理八年級上冊
- 智慧樹知到《軍事理論-軍事思想強化版》章節(jié)測試答案
- 特殊兒童家長知識講座
評論
0/150
提交評論