-1

私はちょうどこれに出くわしました: postifix が bool を 2 回インクリメントするとき、整数値は予想される 2 ではなく 1 のままです。なぜこれが起こるのか知りたいです。

bool test = false; // results in integer 0
test++; // results in integer 1
test++; // results in integer 1

// but there still is at least one byte of memory used:
// results in integer 137
*(unsigned char*)(&test) = 137;
4

3 に答える 3

8

これは、++演算子の指定方法です。C++11 §5.2.6[expr.post.incr]/1 を参照してください (強調鉱山):

後置式++の値は、そのオペランドの値です。[注: 得られた値は元の値のコピーです — 注釈の最後] オペランドは変更可能な左辺値でなければなりません。オペランドの型は、算術型または完全なオブジェクト型へのポインターでなければなりません。

オペランド オブジェクトの値は、オブジェクトが bool 型 (true に設定されている場合) でない限り、それに 1 を追加することによって変更されます。[注: この使用法は非推奨です。付録 D を参照してください — 末尾の注]

(接頭++演算子には、値に適用できるようにする類似の言語がありboolます。)

bool以外の型のポインターまたは参照を使用してオブジェクトを変更すると、bool未定義の動作が発生します。

于 2013-06-24T16:52:08.900 に答える
0

なぜこれが可能ですか?

未定義の動作はまさにそれです-未定義です。何でも起こりえます。

十分なメモリ137が割り当てられている場合、なぜ地獄test++; 結果は1

言語仕様はその動作を定義します。

于 2013-06-24T16:50:50.090 に答える
0

ポインターを別の型にキャストし、読み取り/書き込みを実行することにより、未定義の動作を呼び出したためです。UB = 鼻の悪魔を含め、何でも起こり得る。

于 2013-06-24T16:51:53.180 に答える