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

2017 年 12 月 20 日
 ivito
4271 次点击
所在节点    C
21 条回复
gclove
2017 年 12 月 20 日
理解不了.. i 和 j 没有声明吗 ?
YMB
2017 年 12 月 20 日
c = (i>0)?i:j;// c=i || c=j
c=1;
emmmm...
hitmanx
2017 年 12 月 20 日
还能这样写啊?。。
((i>0) ? i : j)这个返回的是左值?
shoujiaxin
2017 年 12 月 20 日
i 大于 0 就把 1 赋给 i,否则赋给 j ?
QAPTEAWH
2017 年 12 月 20 日
@hitmanx 是的,返回的是引用
geelaw
2017 年 12 月 20 日
if (i > 0) i = 1; else j = 1;

这个对 C 似乎无效。
hitmanx
2017 年 12 月 20 日
搜了一下,还真有人讨论 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 日
不用理解,找写代码回来返工。
IamJ
2017 年 12 月 20 日
要是组里谁写出这样的代码我打断他狗腿
LGA1150
2017 年 12 月 20 日
gcc 编译报错,g++ 正常编译并执行
版本 5.4.0 x86_64-linux-gnu
Terry05
2017 年 12 月 20 日
先不论这条语句执行结果有不有报错,这种让大多数人阅读起来有困难,或是有岐义的代码,在实际项目开发过程就是要尽量避免的,总保不准某些代码最终就交接到了刚毕业的新人手上

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

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

https://study.congcong.us/t/416364

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

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

© 2021 V2EX