読者です 読者をやめる 読者になる 読者になる

とくにあぶなくないRiSKのブログ

危ないRiSKのブログだったかもしれない。本当はRiSKだけどググラビリティとか取得できるIDの都合でsscriskも使ったり。

未初期化の bool 型のオブジェクトをインクリメントする

クイズ

未初期化の bool 型のオブジェクトをインクリメントするとどうなるでしょうか?

#include<iostream>

int main()
{
 bool b, c; // 未初期化
 std::cout << ++b << std::endl;
 c++;
 std::cout << c << std::endl;
}

答え

正解は「true が設定される」です。
初期化・未初期化関係なく未定義動作にはならないみたいですね。
実行結果:

1
1

JIS X3014 を見てみましょう。

前置++ について

5.3.2 増加 及び 減少 接頭語 ++ の演算対象には,1 が加算される。ただし,bool 型の場合には,true が設定さ
れる(この使い方は推奨されない。 ) 。

後置++ について

5.2.6 増加と減少 (snip) 結果を得た後で,そのオブジェクトの値は,1 が加算された値に変
更する。ただし,オブジェクトが bool 型の場合には,true を設定する。
参考 この使い方は,推奨されない(附属書 D 参照)

後置の場合は返される値は不定の値なので使ってはなりません。また,前置・後置ともに推奨されないと明記されているので,この知識を心の奥底にしまって,現実に使うことがないようにしましょう。