C++でif文の条件式中で変数に数値を代入するとどうなるのか?

以下ただの個人的なメモです。

  • 言語仕様として
    • 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回もトチったので古典的でありながら割とやってしまいがちかも。