※ 引述《guest2008 (guest)》之銘言:
: ※ 引述《changyuheng (張昱珩)》之銘言:
: : 我所知的語言,function 的 return 值可以滿足 condition 就不會再做多餘的比較。
: : 例如
: : if (funcA())
: : 不會寫成
: : if (funcA() == true)
: : 請問這樣寫有什麼特殊原因嗎?
: : return 應該是 statement,所以後面接的括弧是給 expression 用的。
: : 但是 (true) 不就是 true 嗎?
: 上面兩種寫法對編譯器來說它都可以吃,沒問題。
: 為什麼這樣寫? 沒什麼:
: 一開始大家寫程式都一定是模仿書上的範例,全部的範例都這樣寫,
: 寫習慣也沒特別去注意(所以真的就是純習慣性問題而已,這才是真正的真相),
: 直到....。
: 程式寫多了,被很多莫名其妙你覺得不會錯的 bug 搞死,
: 除非你就是太單純真的只會寫一種程式語言,不會又要你寫
: C/C++、PHP、JAVA、jquery......哩哩拉拉一大堆語言。
: 把敘述寫完整一點對你寫程式來說,真的花不了你幾豪秒鐘的,
: 但可以避免很多不必要的困擾。
: 例如 if( A || B ) ..... 跟寫 if( (A) || (B) )...
: 根本意思完全相同,但要是 A 是 複合詞,例如他是 2014 && 0xFF
: 你沒加括弧就會出現恐怖的錯誤,而且這個錯誤你的編譯器永遠也檢查不出來。
: 習慣性加 (),不管他多簡單都習慣加括弧,就可以減免你未來 debug 時間,
: 就這麼簡單而已,你要用你的寫法沒人說不行。
: 還有 if( funA() ) 寫 if( funA()==true) 通通都可以,但你的程式碼
: 交給後面維護的人,用後面的寫法,他可以只看這一行就夠了,
: 不需要回去看你的 funA() 到底是什麼碗糕,是返回 float 還是 bool 還是參照。
: 反正寫習慣了,也沒特別去注意,但真的避開了很多麻煩,
: 你要用你的寫法沒人說不可以,只要小心未來不要採到很深的隱藏地雷就好。
: 因為這些都會認為絕對不會錯,編譯器也絕對檢查不出來你真的要表達的意思,
: 他一定會 pass,但最後你會被搞死,尤其你要寫很多種程式語言,各種程式語言
: 又有一點點小小小小差異時,寫完整一點根本就不會錯。
: 我舉兩個案例,你自己去思考
: 案例一:
: 1.1 return(1);
: return(99); ==> if( funA() == true)
: if( funA() == 1 )
: 1.2 return(true); ==> if( funA() == true )
: if( funA() == 1 )
: 案例二:
: #define A (32+64)
: #define B (32+64);
: return A+1000;
: return B+1000;
: return (A+1000);
: retrun (B+1000);
: 以上四個結果你自己去跑一下,當然案例二我真的是純搞笑,
: 但不要你周遭的人還真的發生過這樣的事件..那我就無言了。
: 你就知道括弧的差異了。
這就看你的語言了,C 語言的 if statement 後面是接 boolean condition,
function 的 return value 若不是 boolean 本就不該不加 operator 直接放在這邊,
就算有很多人這樣放,也都是在確信能夠正確 branch 的情況下做的偷懶。
還有,什麼才是 true?
雖然 C99 用 macro 定義了 TRUE = 1,
但是 boolean condition 判斷的仍是 0 或非 0。
funcA() == TRUE 這樣的寫法變成是判斷 funcA() 回傳的是 1 或非 1,
是會讓人困惑的,
因為 == TRUE 和語言認為的 true/false boolean condition 不同,
語言認為的是 != FALSE。
比較好的寫法是 funcA() == 1。