備忘録として。
(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) は、コンパイルの段階ではじいてくれるコンパイラもありますけどね。