以下ただの個人的なメモです。
- 言語仕様として
- falseは「0」
- trueは「0以外」
int a = 1; if(a = 1) // ★条件式の中で代入してしまう { cout << "true" << endl; } else { cout << "false" << endl; }
結果は「true」が出力される。
aに1が代入されて
if(1)
となる。その結果、条件判定が「真」になる。反証としてa=0ならfalseとなる。
VisualStudioなら以下のように警告メッセージが出力される。
警告 C6282, 不適切な演算子です: ブール値のコンテキストの定数の代入式です。代わりに、'==' を使用してください。
ちなみにC++/CLIは上記警告が出ない。非常に困る。実装時に間違って代入しててもコンパイラから報告が無いため、誤代入を防ぐために定数を左辺に書く「ヨーダ記法」、可能であれば変数のconst修飾を使っても良いかもしれない。
// ヨーダ記法:左辺に定数を書いて代入できないようにして誤代入を防ぐ if(1 = a) // const修飾して誤代入を防ぐ foo(const int i) { if(a = 1) // 「エラー E0137, 式は変更可能な左辺値である必要があります」と出てコンパイルエラーになる }
ここ数日で2回もトチったので古典的でありながら割とやってしまいがちかも。