[問題] 請問non-void函數return哪一種寫法比較好?

看板C_and_CPP作者 (Zcode)時間11年前 (2013/11/05 00:38), 編輯推噓19(19039)
留言58則, 20人參與, 最新討論串1/3 (看更多)
開發平台(Platform): Linux 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) 問題(Question): 大家好: 有關於C++的函數 請問一下對於以下兩種non-void函數,哪一種寫法比較好? A bool isLarger(int a, int b) { if (a > b) return true; else return false; } B bool isLarger(int a, int b) { if (a > b) return true; return false } 我個人是覺得A的語意比較清楚,所以比較喜歡A 但是,A的寫法似乎會有non-void函數最後必須要有return敘述的issue 而A的寫法return敘述都是包在if-else區塊之內,所以最後並沒有return敘述 這樣的寫法似乎對於某些compiler會出錯(例如比較舊的GNU g++) 是否即便像A的這種寫法 即使if-else區塊已經handle了所有可能的return情況 但是語法上還是必須再補上一條return? 還是要統一養成習慣寫成B的寫法比較好呢? 想請問大家意見! 感謝!^^ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 118.168.233.251

11/05 08:47, , 1F
用新的 compiler 就好了
11/05 08:47, 1F

11/05 08:49, , 2F
但麻煩就是 常常交作業 批改的人的compiler版本較舊就會出錯
11/05 08:49, 2F
※ 編輯: Zcode 來自: 118.168.233.251 (11/05 08:55)

11/05 09:00, , 3F
折衷一下, 把 else 註解掉如何?
11/05 09:00, 3F

11/05 09:01, , 4F
有時條件複雜時我會在 else 後面補個註解寫什麼條件會進來
11/05 09:01, 4F

11/05 09:02, , 5F
這邊就用個類似的方法, 寫上 else 但不讓(舊的) compiler 看
11/05 09:02, 5F

11/05 09:04, , 6F
是說我很好奇是舊到什麼程度的 compiler? devc4.9 那種程度?
11/05 09:04, 6F

11/05 09:07, , 7F
是的 但是助教很喜歡用dev 4.9測試 因為他以為dev只到4.9 @@
11/05 09:07, 7F

11/05 09:24, , 8F
這種的可以跟老師講吧, 除非老師也不懂那就...
11/05 09:24, 8F

11/05 09:48, , 9F
有的老師還在用 VC6 教學呢 (煙)
11/05 09:48, 9F

11/05 10:38, , 10F
寫 return a>b; 不就好了嗎....
11/05 10:38, 10F

11/05 11:30, , 11F
return a > b;
11/05 11:30, 11F

11/05 12:46, , 12F
要語意更清楚的話,可以參考Single-entry single-exit rule
11/05 12:46, 12F

11/05 12:47, , 13F
特別是用在函式很冗長的情況下
11/05 12:47, 13F

11/05 13:41, , 14F
這題是太簡單所以可以 return a > b;
11/05 13:41, 14F

11/05 13:42, , 15F
我覺得 B 比較好..
11/05 13:42, 15F

11/05 14:33, , 16F
看compiler版本,再決定用哪一種
11/05 14:33, 16F

11/05 14:50, , 17F
如果你想要有 else 也可以 http://codepad.org/AxVRheWK
11/05 14:50, 17F

11/05 15:17, , 18F
這個case的話當然是return a>b;就好,如果是複雜的case
11/05 15:17, 18F

11/05 15:17, , 19F
的話,落落長的code可以少縮排一行讀起來比較爽
11/05 15:17, 19F

11/05 16:07, , 20F
A但是if跟else會加上{}
11/05 16:07, 20F

11/05 16:21, , 21F
推auto
11/05 16:21, 21F

11/05 17:29, , 22F
記得一本書有提到(Code Complete?) 建議現把結果通一
11/05 17:29, 22F

11/05 17:30, , 23F
用一個變數先儲存,最後在Return。 不要有多條路線都
11/05 17:30, 23F

11/05 17:31, , 24F
有Return 這樣。
11/05 17:31, 24F

11/05 17:39, , 25F
剛翻了一下好像是記錯了XD 請幫我D一下上面這幾條 囧
11/05 17:39, 25F

11/05 19:13, , 26F
樓上說的,就是我前面提到的Single-entry single-exit rule
11/05 19:13, 26F

11/05 19:25, , 27F
原來是有的阿XD 這本還沒認真讀完還以為記錯了
11/05 19:25, 27F

11/05 20:56, , 28F
借標題一問 有時候判到錯誤的時候會throw exception
11/05 20:56, 28F

11/05 20:56, , 29F
也會造成類似的問題 請問有沒有什麼好寫法@@
11/05 20:56, 29F

11/05 21:00, , 30F
第一種叫guard clause http://goo.gl/tF1uia
11/05 21:00, 30F

11/05 21:01, , 31F
可以防止產生世界奇觀
11/05 21:01, 31F

11/05 21:01, , 32F
看錯,是B叫guard clause
11/05 21:01, 32F

11/05 21:10, , 33F
single exit 我認為在目前反而是難以閱讀的寫法
11/05 21:10, 33F

11/05 21:10, , 34F
尤其有 exception 或是 tail call 的情況是辦不到的
11/05 21:10, 34F

11/05 23:39, , 35F
我會雞婆再弄一個local bool給唯一的return離開....XD
11/05 23:39, 35F

11/05 23:44, , 36F
一個函式上百行 有7個以上return 有些return包在3層以上if-el
11/05 23:44, 36F

11/05 23:45, , 37F
se巢狀內 看code得記憶能執行到下面是因為眾多上面條件不成立
11/05 23:45, 37F

11/05 23:45, , 38F
這種code我看了半年以後領悟別人提出減少出口的說法
11/05 23:45, 38F

11/06 00:07, , 39F
我想重點在function 不該上百行吧 XD
11/06 00:07, 39F

11/06 01:03, , 40F
哈 這我無能為力阿 code base是前輩們寫的
11/06 01:03, 40F

11/06 01:36, , 41F
所以我在四樓才會提到這種複雜結構會在 else 後面註解寫
11/06 01:36, 41F

11/06 01:37, , 42F
是什麼條件才會進到這個 else 裡
11/06 01:37, 42F

11/06 01:38, , 43F
其實 guard clause 我有時也會寫註解 case 1 case 2
11/06 01:38, 43F

11/06 01:44, , 44F
多人維護多少會有困難 每人註解習慣不同 有人會寫 有人不寫
11/06 01:44, 44F

11/06 01:45, , 45F
有些註解也未必隨著code被更動而更新
11/06 01:45, 45F

11/06 01:49, , 46F
return在我的環境確實很好用 因為有不少polling function
11/06 01:49, 46F

11/06 01:51, , 47F
檢查狀態完達成條件辦完事就閃 不過大概像goto一樣是雙面刃吧
11/06 01:51, 47F

11/06 21:48, , 48F
function call超過2/3頁面就是程式設計師的問題了~~~
11/06 21:48, 48F

11/06 22:18, , 49F
xvid 那個問題其實不在出口太多...
11/06 22:18, 49F

11/06 23:32, , 50F
B比較好
11/06 23:32, 50F

11/06 23:33, , 51F
其實我很討厭else
11/06 23:33, 51F

11/06 23:35, , 52F
B比較好的原因還有一個: 無法判斷的東西本來not larger
11/06 23:35, 52F

11/06 23:35, , 53F
是直觀的答案
11/06 23:35, 53F

11/06 23:37, , 54F
說實在 else越多就是讓人腦去想條件機率
11/06 23:37, 54F

11/06 23:38, , 55F
能減少的話可以提升程式碼易讀性
11/06 23:38, 55F

11/06 23:41, , 56F
更極端一點為了可讀性我有時寧願寫兩次if
11/06 23:41, 56F

11/07 00:22, , 57F
當然是有其他問題 但現在來說這就是其中一種問題...XD
11/07 00:22, 57F

11/08 23:20, , 58F
B 可讀性好
11/08 23:20, 58F
文章代碼(AID): #1IU3t_H9 (C_and_CPP)
文章代碼(AID): #1IU3t_H9 (C_and_CPP)