2017年11月3日金曜日

論理(or/and)代入演算子が欲しい

 失敗時に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 件のコメント:

コメントを投稿