3

我想简化以下表达式(block是一个整数,0或者1):

if (block)
    opts = opts & ~O_NONBLOCK;
else
    opts = opts | O_NONBLOCK;

这就是我想出的:

opts = block ? opts & ~O_NONBLOCK : opts | O_NONBLOCK;

然而,我敢肯定,有一种非常聪明的方法可以做到这一点。

4

3 回答 3

2

这个怎么样?

opts = (opts & ~O_NONBLOCK) | (!block * O_NONBLOCK);

不过,我确实更喜欢你的第一个选项的明确性,而不是这个有点神秘的解决方案。

于 2012-12-28T19:23:24.647 回答
2

你的第一个例子尽可能简单,当然更能解释发生了什么。

如果由于某种原因您迫切希望输入更少的字符,您可以使用赋值运算符,我想:

if (block)
    opts &= ~O_NONBLOCK;
else
    opts |= O_NONBLOCK;

如果可以避免的话,我当然不会走三元运算符路线。

于 2012-12-28T19:24:56.303 回答
1

在第一个版本中,您还可以使用运算符的复合赋值版本

if (block)
    opts &= ~O_NONBLOCK;
else
    opts |= O_NONBLOCK;

:)

虽然我通常更喜欢?:operator 而不是if尽可能和适当的。然而,在这种特定情况下,很难说什么看起来更优雅。

于 2012-12-28T19:24:39.217 回答