Re: [問題] 關於邏輯運算元問題

看板C_and_CPP作者 (朴髮箍)時間14年前 (2011/04/21 12:38), 編輯推噓8(801)
留言9則, 8人參與, 最新討論串2/2 (看更多)
※ 引述《wodada (wodada)》之銘言: : 小弟最近在練習一個小程式,發現有很多基礎事實上並沒有練的很好 : 程式碼如下:http://codepad.org/79ewO9nM : 出來的答案分別是14和16 : 最後一個答案16是很直觀的,可是現在的問題是,為何第一個答案是14呢? : 請各位高手指點迷津,謝謝! : PS:本程式用VC++ 要讀懂一份程式碼, 你不必這麼在乎每一個物件的狀態, 就好像黑 箱一樣, 通常我們在意的是他提供怎樣的輸出, 所以表示狀態的地 方都可以擦掉: int a = □, b = □, c = □, d = □; if( a>b || (c+=1 != 0) && c<d ) ff( a+c ); if 敘述裡通常擺的是值為 true/false的敘述, 而這個敘述本身有 一個結構在, 以上面的 if 來說像是這樣: if( a>b || (c+=1 != 0) && c<d ) 每一個底色標黃色的區塊, 都可以視為一個影響會不會進去if本體 的基本元件, 可以變數改寫成另一種形式 (不適用於函式呼叫等帶 有狀態的行為): bool expr1 = a>b; bool expr2 = (c+= 1 != 0); bool expr3 = c<d; if( expr1 || expr2 && expr3 ) 不過很明顯, expr2 並不是一個最精簡的比較式, 它還帶有一個算 數運算式, 我在這邊還要把它做拆解, 優先權依據可以參考維基: http://ppt.cc/_szr bool expr1 = a>b; bool expr4 = 1 != 0; int expr2 = c+= (int)expr4; bool expr5 = (bool)expr2; bool expr3 = c<d; if( expr1 || expr5 && expr3 ) 注意上面新增了 expr4 以及 expr5, expr2的型態也有改變, 這些 都是為了讓你知道細部作了哪些轉型動作, 再來回到 if 的判斷式 , 其實他還因為優先權的關係, 可以被視為兩個敘述: bool expr1 = a>b; bool expr4 = 1 != 0; int expr2 = c+= (int)expr4; bool expr5 = (bool)expr2; bool expr3 = c<d; bool expr6 = expr5 && expr3; if( expr1 || expr6 ) 就如我上面做的轉換, 你如果在一個敘述內嵌入很多運算式, 會相 對轉換成更多的 expressions, 除非你身旁有計算紙, 不然腦容量 的大小決定了你學習的程度, 無論如何都不要寫得這麼複雜,expr6 的地方如果自己加上括號, 也可以省掉腦內補完的工作. 一個敘述第一眼看的是它的大架構, 以你的程式來說, 大架構就是 兩個部份而已( expr1、expr6 ), 有的人會不厭其煩的把它們的值 用一個具名變數存起來, 用來跟你說「你知道它是什麼意思就好, 不用在意實際的內容, 甚至不用作拆解的動作」, 這也就是為什麼 變數命名會這麼重要的原因, 看一個程式先有對架構的了解, 之後 才有任何對執行流程、邏輯的了解( 這時候才需要把之前用□塗掉 的部份補回來). 為了暸解架構你還要開逐步偵錯、下監看式來觀察每一個物件的狀 態的話, 這基本上就是爛程式無誤. -- ▂▂ ▄▂ T.T.L Listen 2 http://ppt.cc/jIUk ˇ ˇˇ ˇ 說什麼結束 ▃▃ http://ppt.cc/zQtB ψ髮箍 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.121.197.115

04/21 12:40, , 1F
推 我認為程式是寫給人看的 可讀性很重要
04/21 12:40, 1F

04/21 12:42, , 2F
推~ 上色詳盡說明~
04/21 12:42, 2F

04/21 12:48, , 3F
如果是二元運算子,就在左右兩邊都加空格,像這個還故意
04/21 12:48, 3F

04/21 12:48, , 4F
c+=1 != 0 自己誤導自己
04/21 12:48, 4F

04/21 13:33, , 5F
推一個
04/21 13:33, 5F
描述性真的很重要! 雖然有些碼作者可以自動腦內補完, 但那畢竟 和讀者無關。 一個程式的品質有不同面向,作者可能會太拘泥於演算法或 code 的篇幅, 導致其他地方犧牲掉了。 ※ 編輯: loveme00835 來自: 140.121.197.115 (04/21 14:02)

04/21 14:13, , 6F
推loveme大精彩講解
04/21 14:13, 6F

04/21 15:15, , 7F
04/21 15:15, 7F

04/21 17:41, , 8F
原來如此,收穫良多
04/21 17:41, 8F

04/21 22:21, , 9F
推這篇.
04/21 22:21, 9F
文章代碼(AID): #1DhxIsbi (C_and_CPP)
文章代碼(AID): #1DhxIsbi (C_and_CPP)