次の式を簡略化したいと思います (block
は整数、0
または1
):
if (block)
opts = opts & ~O_NONBLOCK;
else
opts = opts | O_NONBLOCK;
これは私が思いついたものです:
opts = block ? opts & ~O_NONBLOCK : opts | O_NONBLOCK;
ただし、それを行うためのはるかに賢い方法があると確信しています。
これはどう?
opts = (opts & ~O_NONBLOCK) | (!block * O_NONBLOCK);
ただし、このやや不可解なソリューションよりも、最初のオプションの明示性を好みます。
最初の例は可能な限り単純であり、何が起こっているのかを説明するのに適しています。
何らかの理由で文字数を減らしたい場合は、代入演算子を使用できます。
if (block)
opts &= ~O_NONBLOCK;
else
opts |= O_NONBLOCK;
あなたがそれを避けることができれば、私は確かに三項演算子ルートをたどりません。
最初のバージョンでは、演算子の複合代入バージョンも使用できます
if (block)
opts &= ~O_NONBLOCK;
else
opts |= O_NONBLOCK;
:)
私は一般的に、可能かつ適切な場合はいつでも?:
operator よりも優先しますが。if
しかし、この特定の状況では、どちらがよりエレガントに見えるかを言うのは困難です.