[C/C++] if 文の条件記述で間違えやすいところ

備忘録として。

(1)

if ( a=1 )
   {
    メインの実行内容
   }
else
   {
  ブランチの実行内容
   }

if 文の条件として、a==1 などとする代わりに、間違えて a=1 とすると、これは常に真となるので、ブランチのほうは実行されないことになります。

(2)

また、下記のようなケースでは、

int a;
int b;

・・・・

if( a=b )
  {
 メインの実行内容
  }
else
  {
   ブランチの実行内容
  }

ここで、b がもし 0 なら、ブランチが実行され、
b が0以外なら、メインが実行される、という感じになります。

(3)

Verilog などに慣れてしまうとやってしまうのが下記のようなケース。

int c;

if( ~c )
{
   メインの実行内容
}
else
{
   ブランチの実行内容
}

~(チルダ)って単項演算子ですから、複数ビットだと、各ビットを反転するわけです。
となると、c が 1 であっても 0 であっても ~c はゼロではないので、常にメインのほうが実行されるようになります。
リントチェックやフォーマル検証すると、else のところが Dead code になるので、注意深く結果を検証すれば気づく可能性は高いです。が、コード書いている時点ではなかなか気づきません。

(1) とか (2) は、コンパイルの段階ではじいてくれるコンパイラもありますけどね。

タイトルとURLをコピーしました