11

私はいくつかの C++ コードを書いています。2 つの関数 (checkXDirtycheckYDirty)を呼び出してtrue、どちらかが を返したら戻りたいと思いますtrue。どちらかが返されても両方を評価する必要がtrueあるため、最初に考えたのは使用することでした

return checkXDirty() | checkYDirty();

これは少し奇妙に見えます (おそらく汚れています)。これは常に C++ で正しい結果を生成しますか? Cの_Bool型はどうですか?(このコードは最終的にどちらの言語にも適用される可能性があり、コードを移植するときに不愉快な驚きは望んでいません)。

4

2 に答える 2

45

どちらかが true を返す場合でも両方を評価する必要があるため、最初に考えたのは...

次に、トリッキーにしようとするのをやめて、コードをできるだけ少ない行に収まるようにします。両方の関数を呼び出して、呼び出す必要があることを明確にします。

const bool x_dirty = is_x_dirty();
const bool y_dirty = is_y_dirty();
return x_dirty || y_dirty;

次に、関数の名前を変更するか、関数を分割します。これは、is_xxx_dirty実際には副作用を引き起こしてはならないものです。その結果、コードの保守が難しくなります

于 2013-02-21T00:34:07.983 に答える
8

値が不確定でない限り、技術的にはビット単位の演算子を使用しても問題ありません。ただし、これは一般的なコーディングの習慣として問題を伴うため、代わりにインライン OR 関数を少しだけ記述し、コンパイラに最適化させます。コンパイラは最適化が得意なので、そのままにしておきましょう。

return eitherOrBothTrue( checkXDirty(), checkYDirty() );

または、あなたが大胆で、コードを保守する人にコードを説明するという挑戦に挑戦する勇気があるなら、

return !bothFalse( checkXDirty(), checkYDirty() );

または、@EdS の回答を読んだので、値を変数に格納するだけでも同様に良いかもしれませんが、次constのように追加します。

bool const xIsDirty = checkXDirty();
bool const yIsDirty = checkYDirty();
return xIsDirty || yIsDirty;
于 2013-02-21T00:34:27.083 に答える