先日、ある同僚が、彼が行っている共通のパターンに気付きました。
if (someBooleanFlag)
{
someBooleanFlag = FALSE;
...do some more stuff...
}
基本的に、クリア オン リード ラッチです。そして、フラグをテストしてワンライナーとしてクリアする賢い方法を知っているかどうか尋ねたところ、ボイラープレート someBooleanFlag = FALSE; を取り除くことができました。少し。これがスタイルが良いかどうかという質問は別として、私が彼のためにできる最善のことは次のようなものであることがわかりました
#define TESTANDCLEAR(var) (var ? var-- : 0)
これは、1 と 0 のみが使用されていることを前提としており、ビットマスクでも機能しません。ウィザーズ・オブ・ザ・スタックに頼って、より良い方法や使用できる他のテクニックがないかどうかを確認することにしました。
(繰り返しますが、TESTANDCLEAR() 式を実行するスタイルが悪いか良いかを議論する必要はありません。実際にそれを実行できるかどうか、および一般的にどのように行うかは、より学術的な課題でした)