Re: [討論] 寫三元判斷式code review被打槍
從 C++ 的角度來說
三元運算子有機會改變 l-value/r-value 的性質,進而破壞最佳化
舉個簡單例子 https://wandbox.org/permlink/8blhqHl417Zmrh9a
可以看到用三元運算子的時候,回傳區域變數竟然要 copy 而不是 move
雖然說 Java 沒有這些
不過你就知道看起來很簡潔的東西,也可能會有你沒意識到的副作用
因為有了這個認知
我個人現在不管什麼語言,都是盡量不用三元運算子,讓自己習慣用安全的寫法
※ 引述《a88241050 (再回頭已是百殘身)》之銘言:
: 小弟寫java的
: 以前常常寫三元判斷式
: 就比如說
: String a;
: if(con) {
: a= "aaa";
: } else {
: a="bbb";
: }
: 這樣就要佔掉六行
: 所以我通常都是寫
: String a= con ? "aaa" : "bbb";
: 從五行變成一行
: 在我看來簡潔又方便
: 但最近給一個資深前輩code review的時候
: 他說不要用三元判斷式
: 因為不好閱讀
: 他工作那麼久也從來不用三元判斷式的
: 而且java有很多套件都可以用來取代三元判斷式
: 所以用三元判斷式真的不好嗎?
--
+1此觀點,Java 雖然沒有這種問題,但這表示這個語法一般
性來說,水很深。不能期待大部份人都深刻了解
個人感覺,如果這知識不是在學這語言前三個月之類的就掌握
表示之後的維護者很可能缺乏這知識。必要性不足的還是避免
C++在很多地方都不能三元 一送上去會被自動檢查打槍
語法真的是簡單為上 有更多事要擔心 這個就輕鬆點
推這篇
厲害
妳原本念的是餐飲 電機 還是資工系
這聽起來像電機的觀念 欸 非常前衛喔
我沒有念過電機系
借問下“回傳local scope object”這本身就很怪?
試想你要寫一個 split string 的函數,應該直覺會宣告成這樣吧 std::vector<std::string> Split(const std::string& str); 那這個回傳的 vector 是不是必然是函數內的區域變數
It's nothing to do with trinary operator...
cathy 的魔掌已經伸來軟工版了…?
只好推rust了,compiler一拳往你臉上,態度矯正
態度矯正應該是摔技(錯棚
Java放到C++會有問題的寫法一堆,要考慮這個還寫什麼Java
Java發明出來就是為了減化C++的這種問題,讓寫的人不用想什
麼區域變數不區域變數,怎麼傳都安全,結果還自己假想會遇
到危險,個人認為這很低能
不同語言就有不同的style切換,沒辦法切換非要用一套習慣是
個人問題吧
為了活用語言特性當然會有不同的 style 但是以本串的 conditional operator vs if-else 來說: 1. 並非語言特有 2. 不影響效能 3. 不影響可讀性 純粹只是自己看得爽不爽的問題
C++的 copy & move constructor
水很深
並不是所有語言用慣用安全語法就更好寫... 例如shell
一堆if else的爛腳本比比皆是 不同語言語法都不同 不
同語言採取不同用法更好 你也不可能統一規範 因為一
堆語言都有獨特點 寫java跑去寫python都會覺得很不適
應先入為主
覺得不好寫其實就是不習慣 曾經我也跟原 po 一樣,覺得一行能寫完的東西變成那麼多行,馬德爆幹醜 所以我說不分語言都會傾向使用 if-else 是為了讓自己習慣 寫多了就不覺得醜,才不會那麼排斥 也可以說是洗腦自己 XD
看來是因為id-expression才有資格implicit move
不然conditional operator在這不改變value category
c++的行為跟如何最佳化有關吧,拿這個跟Java比?
跟最佳化無關
這個case就只是E1 ? E2 : E3沒被規定成move-eligible
自己用std::move cast到xvalue就好。
跟優化無關,clang & gcc ToT開O3都做不到
[class.copy.elision]描述的copy/move elision
感謝補充 (^人^
※ 編輯: holydc (61.228.73.53 臺灣), 12/16/2022 00:49:38@holydc 你那舉例不算是return local scope object而
是 pass local scope object 到 split function 做處
理
所以我才拿shell當例子 寫shell這樣寫我基本不太相信
有人受的了 比起習慣亂七八糟甚至屎山 你把他弄的更
容易維護對你能如期甚至提前完成需求以及節省體力不
是更好嗎 mp消耗完就要消耗hp了
這種例子太多了 有的沒有分號結尾 有的不能用++ 有的要縮
排有的不用 幹脆寫組語了
很多語言沒繼承 沒closure 沒interface 沒有Coroutine 是
不是都不要用比較好
長姿勢
95
首Po小弟寫java的 以前常常寫三元判斷式 就比如說 String a; if(con) {18
三元不能用 算還好了 我還遇過 a=1; ... ...11
Code review 檢查這些會有點太花時間,應該有更重要的東西要看。 可以用一些 Gradle plugins 卡在 CI 比較省事: 1. Checkstyle 顧名思義檢查 style。 2. SpotBugs5
沒有 沒有什麼公認 要解決coding style 最好的辦法就是CTO大頭召集全部RD開會 把這間公司的coding style全都記下來8
這種事情 不就和阿里巴巴一樣 一開始給大家一本手冊 哪些code 或是哪些style在本公司不要出現1X
隨著語法的進步 很多會寫 code 的人都很少寫判斷式了 不管是三元還是 if else 寫太多的判斷式 如果….所以…否則…如果….則又…如果..24
說到switch,想來問問你各位公司的code style是下面哪種 (1) switch Var1 { case a: xxx5
好啦 假設不是反串 我覺得滿有道理的 但有一點其實你說錯了 其實並不是語法進步 之前學 Rust 覺得哇 pattern matching 真是他媽神 好潮喔 後來跑去學 OCaml 我才發現(Rust設計者是OCaml粉 一開始的compiler就是用OCaml寫)9
"特定"情況下的確是好方式 舉個例子 以前我在調校能時候有用過這種方式 這是c#的code部分節錄 void Mem_w(ushort address, byte value) { if (address < 0x2000) NES_MEM[address & 0x7ff] = value;
25
[心得] 數位IC設計面試心得(代PO) 手機排版傷眼請見諒 近期面試了多個數位IC設計的職位 常受惠於ptt 的資訊,因此決定來回饋一下 以下幾乎為板上經常拿來比較的那幾間公司所問的題目18
Re: [討論] 真的有工程師喜歡自己的工作嗎我自己是蠻喜歡寫code的啦,平常也有打比賽的習慣,但是要幫公司做白工是沒門啦。 在公司就是要像tech lead一樣寫一些可以過審查非常物件化的糞code,這樣以後就可以 寫在KPI上說自己做了哪些優化糞code,這樣烤雞才會好棒棒,主管覺得你做了很多事情 (其實早就知道怎麼優化啦) 補充:而且你寫得越複雜高深,C code善用運算子表達式,越能寫出讓以後的人看不懂的10
[問卦] 必修程式設計真的有效果嗎?去年親戚要讀書來家裡寄宿 開學沒多久就說他有上程式設計課(護專) 一開始還納悶護專也要程式設計? 後來想起來疫情前教育部好像在講什麼大家都必修程式設計的事情 本來也沒什麼當作一回事8
[問卦] 看不懂指標該休學嗎欸欸 要期末考了 還是看不懂指標欸 為啥&是and又是取址運算子 *是宣告為指標型態又是取值運算子6
Re: [爆卦] 鄭進一的“家後“歌詞有bug!現在才發文啊?我早就發現了 感情的事,用邏輯來解當然會有問題 這問題發生在'語境' 常舉的例子 太陽曬棉被 和 棉被曬太陽1
[問卦] 看不懂多載運算子怎辦?本肥我暑假覺得C++底子太差惡補 讀到overload operator心中只想幹你娘這是三小 搜一下好像沒什麼人在抱怨這章節 是我太廢嗎 --