1

先日、ある同僚が、彼が行っている共通のパターンに気付きました。

if (someBooleanFlag)
{
    someBooleanFlag = FALSE;
    ...do some more stuff...
}

基本的に、クリア オン リード ラッチです。そして、フラグをテストしてワンライナーとしてクリアする賢い方法を知っているかどうか尋ねたところ、ボイラープレート someBooleanFlag = FALSE; を取り除くことができました。少し。これがスタイルが良いかどうかという質問は別として、私が彼のためにできる最善のことは次のようなものであることがわかりました

#define TESTANDCLEAR(var) (var ? var-- : 0)

これは、1 と 0 のみが使用されていることを前提としており、ビットマスクでも機能しません。ウィザーズ・オブ・ザ・スタックに頼って、より良い方法や使用できる他のテクニックがないかどうかを確認することにしました。

(繰り返しますが、TESTANDCLEAR() 式を実行するスタイルが悪いか良いかを議論する必要はありません。実際にそれを実行できるかどうか、および一般的にどのように行うかは、より学術的な課題でした)

4

2 に答える 2

4

あなたがすでに持っているアプローチであっても、0/1の仮定をする必要はないと思います。割り当ては値を返す式であるため、そのマクロを次のように定義できます。

(var ? !(var = false) : false)

または、コンマ演算子を使用できます。

(var ? ((var = false), true) : false)

Nthビットのビットフィールドテストでこれを機能させたい場合に役立ちます:

(((var & (1 << N)) ? ((var = var & ~(1 << N)), true) : false)
于 2012-11-27T17:25:47.550 に答える
3

醜いですが、これはうまくいくはずだと思います:

if (someBooleanFlag && !(someBooleanFlag = !someBooleanFlag))

神への愛のために、本番コードでこれを行うことは決してありません。

于 2012-11-27T17:29:07.587 に答える