Re: [問題] 關於邏輯運算元問題
※ 引述《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
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
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
討論串 (同標題文章)