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 に答える