作者holydc (のヮの)
看板Soft_Job
标题Re: [讨论] 写三元判断式code review被打枪
时间Thu Dec 15 01:55:32 2022
从 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有很多套件都可以用来取代三元判断式
: 所以用三元判断式真的不好吗?
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 61.228.69.15 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Soft_Job/M.1671040535.A.A1A.html
1F:推 yyhsiu: +1此观点,Java 虽然没有这种问题,但这表示这个语法一般 12/15 02:36
2F:→ yyhsiu: 性来说,水很深。不能期待大部份人都深刻了解 12/15 02:36
3F:→ yyhsiu: 个人感觉,如果这知识不是在学这语言前三个月之类的就掌握 12/15 02:38
4F:→ yyhsiu: 表示之後的维护者很可能缺乏这知识。必要性不足的还是避免 12/15 02:39
5F:推 mmonkeyboyy: C++在很多地方都不能三元 一送上去会被自动检查打枪 12/15 05:27
6F:→ mmonkeyboyy: 语法真的是简单为上 有更多事要担心 这个就轻松点 12/15 05:28
7F:推 hobnob: 推这篇 12/15 08:57
8F:推 leptoneta: 厉害 12/15 09:24
9F:→ cathychg: 你原本念的是餐饮 电机 还是资工系 12/15 09:41
10F:→ cathychg: 这听起来像电机的观念 欸 非常前卫喔 12/15 09:41
11F:→ cathychg: 我没有念过电机系 12/15 09:42
15F:推 HuangHedaz: 借问下“回传local scope object”这本身就很怪? 12/15 09:54
试想你要写一个 split string 的函数,应该直觉会宣告成这样吧
std::vector<std::string> Split(const std::string& str);
那这个回传的 vector 是不是必然是函数内的区域变数
16F:→ antpro: It's nothing to do with trinary operator... 12/15 09:57
17F:推 hobnob: cathy 的魔掌已经伸来软工版了…? 12/15 09:59
18F:推 lycantrope: 只好推rust了,compiler一拳往你脸上,态度矫正 12/15 10:29
19F:推 chuegou: 态度矫正应该是摔技(错棚 12/15 12:09
20F:→ ssccg: Java放到C++会有问题的写法一堆,要考虑这个还写什麽Java 12/15 12:43
21F:→ ssccg: Java发明出来就是为了减化C++的这种问题,让写的人不用想什 12/15 12:48
22F:→ ssccg: 麽区域变数不区域变数,怎麽传都安全,结果还自己假想会遇 12/15 12:49
23F:→ ssccg: 到危险,个人认为这很低能 12/15 12:49
24F:→ ssccg: 不同语言就有不同的style切换,没办法切换非要用一套习惯是 12/15 12:50
25F:→ ssccg: 个人问题吧 12/15 12:50
为了活用语言特性当然会有不同的 style
但是以本串的 conditional operator vs if-else 来说:
1. 并非语言特有
2. 不影响效能
3. 不影响可读性
纯粹只是自己看得爽不爽的问题
26F:推 HuangHedaz: C++的 copy & move constructor 12/15 13:37
27F:推 YukiTW: 水很深 12/15 17:08
28F:→ superpandal: 并不是所有语言用惯用安全语法就更好写... 例如shell 12/15 18:25
29F:→ superpandal: 一堆if else的烂脚本比比皆是 不同语言语法都不同 不 12/15 18:27
30F:→ superpandal: 同语言采取不同用法更好 你也不可能统一规范 因为一 12/15 18:28
31F:→ superpandal: 堆语言都有独特点 写java跑去写python都会觉得很不适 12/15 18:31
32F:→ superpandal: 应先入为主 12/15 18:31
觉得不好写其实就是不习惯
曾经我也跟原 po 一样,觉得一行能写完的东西变成那麽多行,马德爆干丑
所以我说不分语言都会倾向使用 if-else 是为了让自己习惯
写多了就不觉得丑,才不会那麽排斥
也可以说是洗脑自己 XD
34F:→ Dracarys: 看来是因为id-expression才有资格implicit move 12/15 20:10
35F:→ Dracarys: 不然conditional operator在这不改变value category 12/15 20:10
37F:嘘 pttano: c++的行为跟如何最佳化有关吧,拿这个跟Java比? 12/15 22:55
38F:嘘 Dracarys: 跟最佳化无关 12/15 23:16
39F:推 Dracarys: 这个case就只是E1 ? E2 : E3没被规定成move-eligible 12/15 23:49
40F:→ Dracarys: 自己用std::move cast到xvalue就好。 12/15 23:49
41F:→ Dracarys: 跟优化无关,clang & gcc ToT开O3都做不到 12/15 23:49
42F:→ Dracarys: [class.copy.elision]描述的copy/move elision 12/15 23:49
感谢补充 (^人^
※ 编辑: holydc (61.228.73.53 台湾), 12/16/2022 00:49:38
43F:推 HuangHedaz: @holydc 你那举例不算是return local scope object而 12/16 15:34
44F:→ HuangHedaz: 是 pass local scope object 到 split function 做处 12/16 15:34
45F:→ HuangHedaz: 理 12/16 15:34
46F:→ superpandal: 所以我才拿shell当例子 写shell这样写我基本不太相信 12/16 19:24
47F:→ superpandal: 有人受的了 比起习惯乱七八糟甚至屎山 你把他弄的更 12/16 19:25
48F:→ superpandal: 容易维护对你能如期甚至提前完成需求以及节省体力不 12/16 19:26
49F:→ superpandal: 是更好吗 mp消耗完就要消耗hp了 12/16 19:27
50F:嘘 Jichang: 这种例子太多了 有的没有分号结尾 有的不能用++ 有的要缩 12/17 13:06
51F:→ Jichang: 排有的不用 干脆写组语了 12/17 13:06
52F:→ Jichang: 很多语言没继承 没closure 没interface 没有Coroutine 是 12/17 13:12
53F:→ Jichang: 不是都不要用比较好 12/17 13:12
54F:推 freef1y3: 长姿势 12/17 22:34