особенности языка — аномалия c ++ bool — почему это возможно?

Я просто наткнулся на это: когда 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;

-1

Решение

Вот как ++ оператор указан. См. C ++ 11 §5.2.6 [expr.post.incr] / 1 (выделено мной):

Значение постфикса ++ выражение — это значение его операнда. [Примечание: полученное значение является копией исходного значения — примечание конца] Операндом должно быть изменяемое значение l. Тип операнда должен быть арифметическим типом или указателем на полный тип объекта.

Значение объекта операнда изменяется, добавляя 1 к нему, если объект не имеет тип bool, в этом случае он имеет значение true. [Примечание: это использование устарело, см. Приложение D. — Конец примечания]

(Префикс ++ оператор имеет похожий язык, чтобы позволить его применять к bool значение.)

Модификация bool объект через указатель или ссылку типа, отличного от bool дает неопределенное поведение.

8

Другие решения

почему это возможно ?!

Неопределенное поведение — только это — неопределенное. Может случиться что угодно.

если достаточно памяти для 137 выделяется, тогда какого черта test++; результаты в 1?

Спецификация языка определяет это поведение.

0

Потому что вы вызвали неопределенное поведение, приведя указатель к другому типу и выполнив чтение / запись для него. UB = все может случиться, в том числе носовые демоны.

0
По вопросам рекламы [email protected]