推 diabloevagto:推! 12/10 09:39
→ diabloevagto:請問你上網看code都到那邊看? 12/10 09:49
狂搜高手網誌,三份程式設計論壇,csdn(高手會有blog),stack overflow.
二份適合初學者之地下論壇。
推 sjgau:讚! 12/10 10:43
推 flere:看完uva題目後仔細想想寫寫看,再找別人的解法看怎麼寫 12/10 12:49
推 target8917:有時if可轉成switch,增加可讀性 12/10 13:04
同意。有時便變成了「可讀性」與「簡潔性」之取捨問題。
推 heymei0421:好文... 12/10 14:23
→ firejox:使用bitwise... 樹狀數組應該還蠻經典的... 12/10 14:47
推 tonyhsie:找某陣列裡第一個15之元素 把if搬進for迴圈 好像沒差啊? 12/10 14:48
是沒差,不過以原po所說的「簡潔」,不就和原本程式碼差異不大嗎?
這部份也特別聲明了,是在練習對回圈熟悉度、思考力、觀察力。
推 siriusu:同意 12/10 19:57
推 Raymond0710:好文推 12/10 23:21
→ loveme00835:好文雅 12/10 23:35
→ angleevil: cnt+=(i%3==0)<--這種寫法避免掉. 12/11 13:52
→ angleevil:有時候是看你對自己的要求多高.還有資料結構,演算法 12/11 13:53
→ angleevil:計算結構等理論的書打下基礎有多深. 實際上kiss原則 12/11 13:53
→ angleevil:是無數次的經驗累積和模仿得來的.天份只是催化劑而已 12/11 13:54
→ angleevil:實際上還是下苦功和多點人文的養成會比較好 12/11 13:55
推 stonehomelaa:C不保證"true" 是1喔 cnt+=(i%3==0) 會出事滴 12/11 15:09
推 littleshan:standard 6.5.9p3 比較的結果相等時為1 不相等時為0 12/11 16:55
→ angleevil:我沒考慮到那層,我只是覺得這寫法要避免,這是個不小心 12/11 17:15
→ angleevil:就會造成bug的壞習慣.儘管是拿來做例子. 12/11 17:15
→ tonyhsie:內文貳裡的兩種case if判斷只是在字面上消失而已 12/11 18:44
→ tonyhsie:範例程式實際上還是一樣要作if判斷 這樣作法 比較不推 12/11 18:45
推 stonehomelaa:不知道C99有訂了 感謝指正 12/11 19:27
真想不到這段心得會引人這麼多高人的建議,回到 主旨面,原 po 裡一段話
每次看別人寫的code, 就覺得相當簡潔
我也同意二個構面會有一定衝突性:簡潔、可讀與維護,
同時 簡潔與效能並不搭上任何絕對之關係 ,可能小弟在 part 2 舉出的例子沒很好,
但已強調,該段之重點是在鼓勵熟悉 迴圈特性、多思考、多觀察,
對於基本面成長我認為有不少助益,但非鼓勵一定要用簡潔性之寫法,
原因便各版友也已從可讀性、效率面提及,
一樣的效率,程式碼較精簡,但能不能接受、好不好都是看個人,
不就像是原 po 所提到的 2 行 gcd 是一樣的意思嗎,實際上只是寫法簡潔,效能一樣 :)
※ 編輯: tropical72 來自: 180.177.78.41 (12/11 20:43)
推 deangogi:可以請問你說的那些論壇是哪些嗎 12/11 20:50
→ deangogi:我只知道stack overflow 0.0 12/11 20:50
→ tropical72:Programming-Club、Stack Overflow、CSDN、(CodeProj.) 12/11 20:53
→ tropical72:地下論壇就不放上了。 12/11 20:53
→ tropical72:不好意思,我忘了最重要的 ptt,其實這裡高手真的很多. 12/11 20:55
→ tonyhsie:簡潔應該還是要考量效能and/or可讀性 如果兩者皆不成立 12/11 21:02
→ tonyhsie:這樣的簡潔 只能減少程式碼的size 好像沒什麼作用啊 @@ 12/11 21:04
→ tonyhsie:像貳之1 改寫後多了數次 cnt += 0 這種類似 nop 的運算.. 12/11 21:06
→ tonyhsie:另一個問題是angleevil大推文 程式碼本身有隱形前提存在 12/11 21:10
→ tonyhsie:true=1 false=0存在 程式的正確性 是建立在隱形前提上 12/11 21:13
→ tonyhsie:風險跟後續的維護花費 便提高不少 一點淺見 還請見諒 @@" 12/11 21:14
→ tropical72:謝謝建議 :) 但我要說的是,我認為 cnt+=(i%3==0) 去掉 12/11 21:25
→ tropical72:branch 後,雖有數次 nop,但整體代價視 predict.err.定 12/11 21:26
→ tropical72:可能我運氣較好,往往去brach後效能快一點。 12/11 21:26
→ tropical72:至於true=1,false=0這前提,我以為這知識和假定電腦為二 12/11 21:28
→ tropical72:補數系統一樣,何況不少程式語言也有些約定.故以為常識. 12/11 21:29
→ tropical72: 此 12/11 21:30
→ diabloevagto:之前看過有些會定義true是1==1,false是1==0 12/11 21:33
→ tropical72:定義true=1,false=0的情況常在 C language 見到,原因是 12/11 21:34
→ tropical72:C 沒bool,故有時會再多加 typedef int bool; 12/11 21:34
→ tropical72:或 typedef unsigned char; 之類的. 12/11 21:35
→ tropical72:sorry,沒看清d大推文所敘,上面三樓跳了tone.. 12/11 21:40
→ diabloevagto:所以好像有些定義不是像我們想的xdd 12/11 21:48
→ angleevil:厄,我應該打清楚點, 那個寫法真正頭痛的問題是在人 12/12 09:01
→ angleevil:今天只是剛好i%3==0式子中,不小心打成=會被檢查出錯誤 12/12 09:08
→ angleevil:可是如果換成(i == 0)寫法,不小心寫成(i = 0)時.編譯器 12/12 09:09
→ angleevil:無法幫你找警告的(我已經用-Wall -Wextra) 12/12 09:10
→ angleevil:我不像版上一堆高手專研演算法或啃標準書.幾乎我給建議 12/12 09:12
→ angleevil:都是排版和撰寫習慣.這個東西是非常細微的習慣.但是我 12/12 09:15
→ angleevil:知道很多人是略過它. 12/12 09:16
→ xatier:如果寫成 i=0 會噴警告的話就不會有 a=b=c=0 這種慣用法了 12/12 09:46
→ angleevil:if (i = 0)會喔,但是(i = 0)不會. 12/12 10:04
→ shadow0326:為什麼我的gcc不會警告 if (i = 0) o_0" 12/12 10:11
→ shadow0326:我已經加了-Wall -Wextra -pedantic 12/12 10:12
→ angleevil:警告:建議在做為真值的賦值敘述前後加上括號<-這讓很多 12/12 10:14
→ xatier:@angleevil: 我是指放在 if 外面的 i=0 XD 12/12 10:15
→ xatier:總不可能有人寫 if( a=b=c=0 ) 吧XDDDDD 12/12 10:15
→ angleevil:人霧煞煞. 實際上它的意思是把=和==做一個區隔. 12/12 10:15
→ angleevil:xatier,壞習慣一旦養成,會造成很多天兵code.尤其是趕專 12/12 10:17
→ angleevil:案時,特別會出現喔^.<. 不過這討論就停止吧!因為這偏向 12/12 10:18
→ angleevil:我個人習慣. ^.<我也很常寫出天兵code喔 12/12 10:19
→ xatier:不過 while ((c=getchar())) {...} 倒是蠻常見的XD 12/12 10:20
→ xatier:寫 code 時頭腦要清楚就好XD 只是常常腦袋不清楚就在趕工:P 12/12 10:21
→ angleevil:看來有結論了,所以我才不建議cnt+=(i%3==0)<-此習慣 12/12 10:24
→ angleevil:不過那是tropica舉例,只是給小建議. 12/12 10:26
→ angleevil:而且要讓true = 1,false = 0.要記得引用stdbool.h<-c99 12/12 10:29
推 littleshan:==的比較結果是傳回int,和stdbool.h無關 12/12 10:34
→ angleevil:<(__)> 謝謝littleshan 12/12 10:37
→ xatier:stdbool 是讓我們可以直接用 bool 來宣告東西吧@@? 12/12 15:47