從 C++ 的角度來說
三元運算子有機會改變 l-value/r-value 的性質,進而破壞最佳化
舉個簡單例子
https://wandbox.org/permlink/8blhqHl417Zmrh9a
可以看到用三元運算子的時候,回傳區域變數竟然要 copy 而不是 move
雖然說 Java 沒有這些
不過你就知道看起來很簡潔的東西,也可能會有你沒意識到的副作用
因為有了這個認知
我個人現在不管什麼語言,都是盡量不用三元運算子,讓自己習慣用安全的寫法
: 小弟寫java的
: 以前常常寫三元判斷式
: 就比如說
: String a;
: if(con) {
: a= "aaa";
: } else {
: a="bbb";
: }
: 這樣就要佔掉六行
: 所以我通常都是寫
: String a= con ? "aaa" : "bbb";
: 從五行變成一行
: 在我看來簡潔又方便
: 但最近給一個資深前輩code review的時候
: 他說不要用三元判斷式
: 因為不好閱讀
: 他工作那麼久也從來不用三元判斷式的
: 而且java有很多套件都可以用來取代三元判斷式
: 所以用三元判斷式真的不好嗎?
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 61.228.69.15 (臺灣)
※ 文章網址: https://www.ptt.cc/bbs/Soft_Job/M.1671040535.A.A1A.htmlyyhsiu1樓+1此觀點,Java 雖然沒有這種問題,但這表示這個語法一般 12/15 02:36
→ yyhsiu2樓性來說,水很深。不能期待大部份人都深刻了解 12/15 02:36
→ yyhsiu3樓個人感覺,如果這知識不是在學這語言前三個月之類的就掌握 12/15 02:38
→ yyhsiu4樓表示之後的維護者很可能缺乏這知識。必要性不足的還是避免 12/15 02:39
mmonkeyboyy5樓C++在很多地方都不能三元 一送上去會被自動檢查打槍 12/15 05:27
→ mmonkeyboyy6樓語法真的是簡單為上 有更多事要擔心 這個就輕鬆點 12/15 05:28
hobnob7樓推這篇 12/15 08:57
leptoneta8樓厲害 12/15 09:24
→ cathychg9樓妳原本念的是餐飲 電機 還是資工系 12/15 09:41
→ cathychg10樓這聽起來像電機的觀念 欸 非常前衛喔 12/15 09:41
→ cathychg11樓我沒有念過電機系 12/15 09:42
cathychg12樓 12/15 09:43 → cathychg13樓 12/15 09:44 → cathychg14樓 12/15 09:45 HuangHedaz15樓借問下“回傳local scope object”這本身就很怪? 12/15 09:54
試想你要寫一個 split string 的函數,應該直覺會宣告成這樣吧
std::vector<std::string> Split(const std::string& str);
那這個回傳的 vector 是不是必然是函數內的區域變數
→ antpro16樓It's nothing to do with trinary operator... 12/15 09:57
hobnob17樓cathy 的魔掌已經伸來軟工版了…? 12/15 09:59
lycantrope18樓只好推rust了,compiler一拳往你臉上,態度矯正 12/15 10:29
chuegou19樓態度矯正應該是摔技(錯棚 12/15 12:09
→ ssccg20樓Java放到C++會有問題的寫法一堆,要考慮這個還寫什麼Java 12/15 12:43
→ ssccg21樓Java發明出來就是為了減化C++的這種問題,讓寫的人不用想什 12/15 12:48
→ ssccg22樓麼區域變數不區域變數,怎麼傳都安全,結果還自己假想會遇 12/15 12:49
→ ssccg23樓到危險,個人認為這很低能 12/15 12:49
→ ssccg24樓不同語言就有不同的style切換,沒辦法切換非要用一套習慣是 12/15 12:50
→ ssccg25樓個人問題吧 12/15 12:50
為了活用語言特性當然會有不同的 style
但是以本串的 conditional operator vs if-else 來說:
1. 並非語言特有
2. 不影響效能
3. 不影響可讀性
純粹只是自己看得爽不爽的問題
HuangHedaz26樓C++的 copy & move constructor 12/15 13:37
YukiTW27樓水很深 12/15 17:08
→ superpandal28樓並不是所有語言用慣用安全語法就更好寫... 例如shell 12/15 18:25
→ superpandal29樓一堆if else的爛腳本比比皆是 不同語言語法都不同 不 12/15 18:27
→ superpandal30樓同語言採取不同用法更好 你也不可能統一規範 因為一 12/15 18:28