В старые времена C не было никакого логического типа. Люди использовали int
для хранения логических данных, и это работало в основном. Ноль был ложным, а все остальное было правдой.
Это означало, что если вы взяли, int flag = 0;
а потом сделали, flag++
значение было бы истинным Это будет работать независимо от значения флага (если вы не сделали этого много, он перевернулся, и вы вернулись к нулю, но давайте проигнорируем это) - при увеличении значения флага, равного 1, будет 2, что все еще правда.
Некоторые люди использовали это для безоговорочной установки логического значения в true. Я не уверен, что это когда-либо стало идиоматическим , но это в некотором коде.
Это никогда не работало --
, потому что если бы значение было чем-то отличным от 1 (что могло бы быть), значение все равно не было бы ложным. И если оно уже было ложным ( 0
), и вы применили оператор декремента, оно не останется ложным.
При переходе кода с C на C ++ в первые дни было очень важно, чтобы код на C, включенный в C ++, все еще мог работать. И поэтому в спецификации для C ++ (раздел 5.2.6 (на странице 71)) он гласит:
Значение, полученное путем применения postfix ++, является значением, которое операнд имел до применения оператора. [Примечание: полученное значение является копией исходного значения] Операндом должно быть изменяемое значение l. Тип операнда должен быть арифметическим типом или указателем на полный тип объекта. После того, как результат отмечен, значение объекта изменяется, добавляя 1 к нему, если объект не имеет тип bool
, в этом случае это установлено в true. [Примечание: это использование устарело, см. Приложение D.]
Операнд постфикса - уменьшается аналогично оператору постфикса ++, за исключением того, что операнд не должен иметь тип bool
.
Это снова упоминается в разделе 5.3.2 (для префиксного оператора - 5.2.6 был на постфиксе)
Как видите, это устарело (Приложение D в документе, стр. 709) и не должно использоваться.
Но вот почему. И иногда вы можете увидеть код. Но не делай этого.