Я просто наткнулся на это: когда postifix увеличивает значение bool вдвое, целочисленное значение по-прежнему равно 1 вместо ожидаемого 2. Я хотел бы знать, почему это происходит.
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;
Вот как ++
оператор указан. См. C ++ 11 §5.2.6 [expr.post.incr] / 1 (выделено мной):
Значение постфикса
++
выражение — это значение его операнда. [Примечание: полученное значение является копией исходного значения — примечание конца] Операндом должно быть изменяемое значение l. Тип операнда должен быть арифметическим типом или указателем на полный тип объекта.Значение объекта операнда изменяется, добавляя 1 к нему, если объект не имеет тип bool, в этом случае он имеет значение true. [Примечание: это использование устарело, см. Приложение D. — Конец примечания]
(Префикс ++
оператор имеет похожий язык, чтобы позволить его применять к bool
значение.)
Модификация bool
объект через указатель или ссылку типа, отличного от bool
дает неопределенное поведение.
почему это возможно ?!
Неопределенное поведение — только это — неопределенное. Может случиться что угодно.
если достаточно памяти для
137
выделяется, тогда какого чертаtest++
; результаты в1
?
Спецификация языка определяет это поведение.
Потому что вы вызвали неопределенное поведение, приведя указатель к другому типу и выполнив чтение / запись для него. UB = все может случиться, в том числе носовые демоны.