如何理解 ((i>0) ? i : j) = 1;

2017-12-20 19:32:39 +08:00
 ivito
3599 次点击
所在节点    C
21 条回复
gclove
2017-12-20 19:35:34 +08:00
理解不了.. i 和 j 没有声明吗 ?
YMB
2017-12-20 19:36:43 +08:00
c = (i>0)?i:j;// c=i || c=j
c=1;
emmmm...
hitmanx
2017-12-20 19:39:06 +08:00
还能这样写啊?。。
((i>0) ? i : j)这个返回的是左值?
shoujiaxin
2017-12-20 19:39:31 +08:00
i 大于 0 就把 1 赋给 i,否则赋给 j ?
QAPTEAWH
2017-12-20 19:40:21 +08:00
@hitmanx 是的,返回的是引用
geelaw
2017-12-20 19:41:39 +08:00
if (i > 0) i = 1; else j = 1;

这个对 C 似乎无效。
hitmanx
2017-12-20 19:42:36 +08:00
搜了一下,还真有人讨论 ternary operator expression 是不是 lvalue 的:https://www.reddit.com/r/ProgrammerTIL/comments/4zr491/c_a_ternary_operator_expression_is_an_lvalue/?st=jbezlb70&sh=ff573171

这个写法估计代码 review 的时候会被喷
fatttt
2017-12-20 19:51:47 +08:00
不用理解,找写代码回来返工。
IamJ
2017-12-20 20:19:40 +08:00
要是组里谁写出这样的代码我打断他狗腿
LGA1150
2017-12-20 21:30:16 +08:00
gcc 编译报错,g++ 正常编译并执行
版本 5.4.0 x86_64-linux-gnu
Terry05
2017-12-20 21:45:55 +08:00
先不论这条语句执行结果有不有报错,这种让大多数人阅读起来有困难,或是有岐义的代码,在实际项目开发过程就是要尽量避免的,总保不准某些代码最终就交接到了刚毕业的新人手上

这种类似于 “炫技” 的代码,要么可以在开源插件里使用,以表示作者的高超水平,要么最好就面试题里,教科书里弄弄就好,做项目就是要尽量避免给自己给别人挖坑
lrxiao
2017-12-21 01:57:39 +08:00
ternary 首先要是同类型不然会做 common_type 转换成 rvalue
lrxiao
2017-12-21 01:59:43 +08:00
c 语法就不支持这种
Tink
2017-12-21 02:07:34 +08:00
为了三目而三目
amai
2017-12-21 08:09:23 +08:00
三元判断
print1024
2017-12-21 08:21:09 +08:00
等价于 if (i>0){i=1}else{j=1}
ray8888
2017-12-21 08:35:44 +08:00
写这种代码有什么意思,没有一点易读性
dumplinger
2017-12-21 09:45:52 +08:00
@hitmanx 噗,不是左值……
canxden
2017-12-21 11:22:56 +08:00
Expression is not assignable
hackpro
2017-12-21 14:29:34 +08:00
@lrxiao #12 正解
而且这代码 rvalue 还能赋值?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/416364

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX