我想简化以下表达式(block
是一个整数,0
或1
):
if (block)
opts = opts & ~O_NONBLOCK;
else
opts = opts | O_NONBLOCK;
这就是我想出来的:
opts = block ? opts & ~O_NONBLOCK : opts | O_NONBLOCK;
但是,我确信有一种非常聪明的方法可以做到这一点。
答案 0 :(得分:2)
这个怎么样?
opts = (opts & ~O_NONBLOCK) | (!block * O_NONBLOCK);
但我确实更喜欢你的第一个选项的明确性,而不是这个有点神秘的解决方案。
答案 1 :(得分:2)
你的第一个例子就是尽可能简单,当然更好地解释发生了什么。
如果出于某种原因你迫切想要输入更少的字符,那么可以使用赋值运算符,我想:
if (block)
opts &= ~O_NONBLOCK;
else
opts |= O_NONBLOCK;
如果可以避免,我当然不会沿着三元运营商的路线走下去。
答案 2 :(得分:1)
在第一个版本中,您还可以使用运算符的复合赋值版本
if (block)
opts &= ~O_NONBLOCK;
else
opts |= O_NONBLOCK;
:)
虽然我通常会尽可能选择?:
运营商而不是if
运营商。然而在这种特殊情况下,很难说什么看起来更优雅。