Re: [讨论] 写三元判断式code review被打枪

楼主: holydc (のヮの)   2022-12-15 01:55:32
从 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有很多套件都可以用来取代三元判断式
: 所以用三元判断式真的不好吗?
作者: yyhsiu (hsiu)   2022-12-15 02:36:00
+1此观点,Java 虽然没有这种问题,但这表示这个语法一般性来说,水很深。不能期待大部份人都深刻了解个人感觉,如果这知识不是在学这语言前三个月之类的就掌握表示之后的维护者很可能缺乏这知识。必要性不足的还是避免
作者: mmonkeyboyy (great)   2022-12-15 05:27:00
C++在很多地方都不能三元 一送上去会被自动检查打枪语法真的是简单为上 有更多事要担心 这个就轻松点
作者: hobnob (hobnob)   2022-12-15 08:57:00
推这篇
作者: leptoneta (台湾高山族自治区书记)   2022-12-15 09:24:00
厉害
作者: cathychg (凯西)   2022-12-15 09:41:00
妳原本念的是餐饮 电机 还是资工系这听起来像电机的观念 欸 非常前卫喔我没有念过电机系https://i.imgur.com/cyrFsY4.jpghttps://i.imgur.com/DOAJ2AD.jpghttps://i.imgur.com/2zeLhGt.jpg
作者: HuangHedaz (Hedaz)   2022-12-15 09:54:00
借问下“回传local scope object”这本身就很怪?
作者: antpro (-_*|| 宅)   2022-12-15 09:57:00
It's nothing to do with trinary operator...
作者: hobnob (hobnob)   2022-12-15 09:59:00
cathy 的魔掌已经伸来软工版了…?
作者: lycantrope (阿宽)   2022-12-15 10:29:00
只好推rust了,compiler一拳往你脸上,态度矫正
作者: chuegou (chuegou)   2022-12-15 12:09:00
态度矫正应该是摔技(错棚
作者: ssccg (23)   2022-12-15 12:43:00
Java放到C++会有问题的写法一堆,要考虑这个还写什么JavaJava发明出来就是为了减化C++的这种问题,让写的人不用想什么区域变量不区域变量,怎么传都安全,结果还自己假想会遇到危险,个人认为这很低能不同语言就有不同的style切换,没办法切换非要用一套习惯是个人问题吧
作者: HuangHedaz (Hedaz)   2022-12-15 13:37:00
C++的 copy & move constructor
作者: YukiTW (ゆうき)   2022-12-15 17:08:00
水很深
作者: superpandal   2022-12-15 18:25:00
并不是所有语言用惯用安全语法就更好写... 例如shell一堆if else的烂脚本比比皆是 不同语言语法都不同 不同语言采取不同用法更好 你也不可能统一规范 因为一堆语言都有独特点 写java跑去写python都会觉得很不适应先入为主
作者: Dracarys (MayShowGunMore)   2022-12-15 20:10:00
https://wg21.link/expr.prim.id.unqual#4.1看来是因为id-expression才有资格implicit move不然conditional operator在这不改变value categoryhttps://wg21.link/expr.cond#5
作者: pttano (pttano)   2022-12-15 22:55:00
c++的行为跟如何最佳化有关吧,拿这个跟Java比?
作者: Dracarys (MayShowGunMore)   2022-12-15 23:16:00
跟最佳化无关这个case就只是E1 ? E2 : E3没被规定成move-eligible自己用std::move cast到xvalue就好。跟优化无关,clang & gcc ToT开O3都做不到[class.copy.elision]描述的copy/move elision
作者: HuangHedaz (Hedaz)   2022-12-16 15:34:00
@holydc 你那举例不算是return local scope object而是 pass local scope object 到 split function 做处理
作者: superpandal   2022-12-16 19:24:00
所以我才拿shell当例子 写shell这样写我基本不太相信有人受的了 比起习惯乱七八糟甚至屎山 你把他弄的更容易维护对你能如期甚至提前完成需求以及节省体力不是更好吗 mp消耗完就要消耗hp了
作者: Jichang (C.C.Lemon)   2022-12-17 13:06:00
这种例子太多了 有的没有分号结尾 有的不能用++ 有的要缩排有的不用 干脆写组语了很多语言没继承 没closure 没interface 没有Coroutine 是不是都不要用比较好
作者: freef1y3 ( )   2022-12-17 22:34:00
长姿势

Links booklink

Contact Us: admin [ a t ] ucptt.com