Почему оператор --
не существует для bool, а для оператора ++
?
Я пробовал в C ++, и я не знаю, относится ли мой вопрос к другому языку. Я буду рад узнать также.
Я знаю , я могу использовать оператор ++
с бул. Это делает любое bool равным истине.
bool b = false;
b++;
// Now b == true.
Почему мы не можем использовать оператор --
противоположным образом?
bool b = true;
b--;
// Now b == false;
Это не очень полезно, но мне любопытно.
Ответы:
В старые времена C не было никакого логического типа. Люди использовали
int
для хранения логических данных, и это работало в основном. Ноль был ложным, а все остальное было правдой.Это означало, что если вы взяли,
int flag = 0;
а потом сделали,flag++
значение было бы истинным Это будет работать независимо от значения флага (если вы не сделали этого много, он перевернулся, и вы вернулись к нулю, но давайте проигнорируем это) - при увеличении значения флага, равного 1, будет 2, что все еще правда.Некоторые люди использовали это для безоговорочной установки логического значения в true. Я не уверен, что это когда-либо стало идиоматическим , но это в некотором коде.
Это никогда не работало
--
, потому что если бы значение было чем-то отличным от 1 (что могло бы быть), значение все равно не было бы ложным. И если оно уже было ложным (0
), и вы применили оператор декремента, оно не останется ложным.При переходе кода с C на C ++ в первые дни было очень важно, чтобы код на C, включенный в C ++, все еще мог работать. И поэтому в спецификации для C ++ (раздел 5.2.6 (на странице 71)) он гласит:
Это снова упоминается в разделе 5.3.2 (для префиксного оператора - 5.2.6 был на постфиксе)
Как видите, это устарело (Приложение D в документе, стр. 709) и не должно использоваться.
Но вот почему. И иногда вы можете увидеть код. Но не делай этого.
источник
Частично справиться с унаследованным кодом, который использовал
int
или похож на его логический тип.источник
Чтобы понять историческое значение этого вопроса, вы должны рассмотреть случай с Therac-25. Therac-25 был медицинским устройством, которое доставляло излучение больным раком. Его преследовали плохие методы программирования, которые способствовали его плохой репутации в области безопасности (с несколькими приписанными ему смертями).
http://courses.cs.vt.edu/professionalism/Therac_25/Therac_1.html
(перейти к нижней части страницы 3)
Therac-25 использовал что-то вроде эквивалента
operator++
на abool
. Однако язык программирования, который они использовали, не был C ++, а их тип данных - нетbool
. В отличие от гарантии в C ++, обычный целочисленный тип просто продолжает расти. Их тип данных был эквивалентомuint8_t
.C ++ решил оставить
operator++
людей, привыкших к программированию подобным образом, но вместо того, чтобы увеличивать значение, он просто устанавливает егоtrue
для предотвращения подобных вещей.Обратите внимание, что
operator++(bool)
не рекомендуется.http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3797.pdf
Приложение D к C ++ 14:
источник
bool
типом. Я просто пытался привести исторический пример того, когда люди действительно программировали таким образом.