За старих часів С булевого типу не було. Люди використовували int
для зберігання булевих даних, і це працювало здебільшого. Нуль був помилковим, а все інше було правдою.
Це означало, що якщо ви взяли int flag = 0;
і пізніше зробили flag++
це значення, було б істинним. Це спрацювало б незалежно від значення прапора (якщо ви цього багато не зробили, він перекинувся і ви повернулися до нуля, але нехтуєте цим) - збільшення прапора, коли його значення було 1, дало б 2, яке все ще було правда.
Деякі люди використовували це для безумовного встановлення булевого значення true. Я не впевнений, що це колись стало ідіоматичним , але це є в деякому коді.
Це ніколи не спрацьовувало --
, оскільки якби значення було чимось іншим, ніж 1 (яке воно могло бути), значення все одно не було б помилковим. І якби воно вже було false ( 0
), і ви зробили оператор decrement на ньому, він не залишився б false.
Під час переміщення коду з C на C ++ в перші дні було дуже важливо, щоб код C, включений до C ++, все ще міг працювати. І так, у специфікації для C ++ (розділ 5.2.6 (його на стор. 71)) він говорить:
Значення, отримане за допомогою застосування постфікса ++, є значенням, яке операнд мав перед застосуванням оператора. [Примітка: отримане значення є копією вихідного значення] Операнд має змінюватися значення. Тип операнда має бути арифметичним типом або вказівником на тип цілісного об'єкта. Після того, як результат буде відзначений, значення об'єкта змінюється додаванням до нього 1, крім випадків, коли об’єкт не має типу bool
, і в цьому випадку він встановлюється в true. [Примітка: це використання застаріло, див. Додаток D.]
Операнд Postfix - зменшується аналогічно оператору postfix ++, за винятком того, що операнд не повинен мати тип bool
.
Це знову згадується у розділі 5.3.2 (для оператора префікса - на постфіксі був 5.2.6)
Як бачите, це застаріле (додаток D у документі, сторінка 709) і не повинно використовуватись.
Але ось чому. І іноді ви можете побачити код. Але не робіть цього.