失敗時に0、成功時に0以外(不定/実装依存)を返す関数hoge,fugaが有ったとする。
int flag = 1;
flag &= hoge();
flag &= fuga();
if (flag)
{
}
else
{
}
意図する処理は、双方ともに成功したらifを処理し、片方でも失敗したらelseを処理する、という流れ。
しかし、これは上手く動かない。
hogeが成功時に1を返し、fugaが成功時に2を返した場合、1&2は0になるからだ。この場合、期待通りの処理を行うには、ビットAND代入演算子(&=)ではなく、論理AND代入演算子(&&=)が必要になる。しかしそんなものはない。
flag = flag && hoge();
flag = flag && fuga();
と書けば期待する処理になるが、なんとも冗長なコードになる。
どうにかならんものか。
flag &= !!hoge();
flag &= !!fuga();
というコードであれば、1回目のnotで反転し、2回目のnotで元の論理値に戻り、この際にコンパイラのfalse/true値に置き換わるので、コンパイラのtrue同士のANDとなり、うまく動く。でも、なんか綺麗じゃない。
変数や配列やポインタの説明とか、関数の使い方とかじゃなくて、こういう小ネタが書いてある本を読みたい。
0 件のコメント:
コメントを投稿