- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
如果我们希望在任一个或两种条件皆为真的情况下
不管是有沒有經驗的C程式設計師,都很容易犯一種錯誤。我們覺得有必要用一個章節來討論這種錯誤。 這種錯誤就是:不小心地混用== (相等) 運算子和= (指定) 運算子。 這種混用為什麼這麼危險呢?原因在於它通常不會造成編譯錯誤。 含有這種錯誤的程式通常可正確地編譯,但程式執行的結果卻可能會因執行時的邏輯錯誤而不正確。 引起這個問題的原因是來自於C的兩項特性。 第一,C中可以產生值的任何運算式,都可使用在任何控制敘述式的判斷部分裡。 如果值是零,便當做偽。如果值不是零,則當做真。 第二,C的指定動作會產生值,此值便是指定給指定運算子左邊之變數的值。 舉例來說,假設我們想要寫的是 if ( payCode == 4 ) printf( You get a bonus! ); but we accidentally write if ( payCode = 4 ) printf( You get a bonus! ); 第一個if敘述式會在payCode等於4的時候,正確地印出You get a bonus!這項訊息。 第一個if敘述式會在payCode等於4的時候,正確地印出You get a bonus!這項訊息。第二個if敘述式是一道有錯的敘述式,它會執行if條件裡的指定運算式。 這個運算式是個簡單的指定動作,其值為常數4。 因為任何非零的數值都會解釋為「真」,因此if敘述式的條件將永遠為真,不管那個人的payCode是多少,都會拿到獎金!。 程式設計師在撰寫條件式時,通常會將變數名稱寫在左邊,而將常數寫在右邊,如x == 7。 如果將這個習慣改成常數在左邊,變數在右邊,也就是7 == x的話,當程式設計師不小心將==誤寫成=時,編譯器便會將這個錯誤找出來。 編譯器會認為這是一個語法錯誤,因為只有變數名稱才能放在指定運算子的左邊。 至少這樣子可避免因不小心所造成的執行時邏輯錯誤。 變數名稱認為是個lvalues (left values, 即左邊數值),因為他們可放在指定運算子的左邊。 常數認為是個rvalues (right values,即右邊數值),因為他們只能放在指定運算子的右邊。 lvalues也可以用做rvalues,但反過來則不行。 另外一種情況是將=誤寫成==。 假設原先你想要把一個值設定給變數,如下列的簡單敘述式: x = 1; 卻不小心地寫成 x == 1; 同樣的,這也不會是個語法錯誤。 編譯器只會把它當成是一個比較運算式。 如果x等於1的話,則此條件為真並且運算式會傳回值1。 如果x不等於1,則此條件為偽而運算式會傳回值0。 但不論傳回什麼數值,由於這裡沒有指定運算子,數值就只是消失了。因此x的值不會改變,這可能會造成一個執行時的邏輯錯誤。 很不幸的,我們並沒有什麼法寶可以幫助你解決這個問題。 圖4.17是第三和第四章所討論之控制敘述式的總整理。 圖中的小圓形代表每一控制敘述式的單一入口和單一出口。 任意地連接個別的流程圖符號可能會導致非結構化的程式。 因此,程式設計的風格應以組合流程圖符號來構成限定的一些控制敘述式,並以兩種方式正確地組合控制敘述式來建構出結構化程式。 簡而言之,僅使用單一入口/單一出口的控制敘述式,也就是說,每個控制敘述式只有一個方式能夠進入也只有一個方式能夠離開。 循序地連接控制敘述式以形成結構化程式是很簡單的-某一控制敘述式的出口點直接連到另一控制敘述式的入口點,亦即在程式中一個接一個地放置控制敘述式;這種方式稱為「控制敘述式的堆疊」。 此外我們還可以將控制敘述式連接成巢狀的敘述式。 圖4.18列出了正確建構結構化程式的規則。 這些規則假設矩形的流程圖符號可以用來表示任何的動作,包括輸入/輸出在內。 圖4.19為最簡單的流程圖。 運用了圖4.18的規則一定能夠讓我們得到一張整齊的,區塊狀的結構化流程圖。 例如,將規則2重複地運用到最簡單的流程圖 (圖4.19) 身上,將可得到一張含有許多循序排列之矩形的結構化流程圖 (圖4.20)。 請注意規則2產生了控制敘述式的堆疊,因此讓我們稱之為堆疊規則 (stacking rule)。 規則3稱為巢狀規則 (nesting rule)。 對最簡單的流程圖重複運用規則3的話,將可得到一張含有整齊巢狀控制敘述式的流程圖。 舉例來說,在圖4.21中,最簡單的流程圖的矩形首先換成一個雙重選擇if…else敘述式。 然後再將規則3運用到雙重選擇敘述式的兩個矩形身上,以雙重選擇敘述式換掉了每一個矩形。 圖中用虛線包起來的雙重選擇敘述式代表矩形替換掉的部分。 圖4.18的規則4可產生更大,更複雜且更深的巢狀敘述式。 運用此規則所畫出的流程圖可包含任何可能的結構化流程圖,亦即包含了所有可能的結構化程式。 由於我們希望消除got
您可能关注的文档
最近下载
- 西南18J112 墙标准图集.pdf VIP
- 2025-2026学年高一上学期《树立正确三观:从庞众望的成长看青春担当》主题班会课件.pptx
- 北京市海淀区2024~2025学年七年级上学期期中考试数学试卷.docx
- 2025电力数据资产管理体系白皮书.docx VIP
- 《运动神经元病》课件.pptx VIP
- 肾上腺皮质腺瘤护理查房.pptx VIP
- 药物制剂生产实训(初级)课件 2-2 PPT:人员卫生管理.pptx
- 三年(2023-2025)中考历史真题分类汇编:专题07 统一多民族国家的巩固与发展·选择题(全国通用)(解析版).docx VIP
- 环境工程原理课件.pptx VIP
- 5_1_名雅化工不饱和聚脂树脂腻子(原子灰)MSDS.docx VIP
文档评论(0)