Він походить з історії використання цілих значень як булевих значень.
Якщо xє int, але я використовую його як булеве значення, if(x)...то нарощення означатиме, що незалежно від значення його істини перед операцією, воно буде мати значення істинності trueпісля нього (перекриття заборони).
Однак неможливо передбачити результат --даного знання лише значення істинності x, оскільки це може призвести до false(якщо інтегральне значення дорівнює 1) або true(якщо інтегральне значення є чимось іншим - зокрема, це включає 0 [ false] та 2 або докладніше [ true]).
Так, як короткометражка ++працювала, а --ні.
++ дозволено на bools для сумісності з цим, але його використання застаріло в стандарті.
Це передбачає, що я використовую лишеx як булевий, що означає, що переповнення не може відбуватися до тих пір, поки я цього не зробив ++досить часто, щоб самостійно викликати переповнення. Навіть із знаком char як типом, що використовується, і CHAR_BITSчимось низьким, як 5, це 32 рази, перш ніж це більше не працює (це все-таки достатньо аргументу, що це погана практика, я не захищаю практику, просто пояснюю, чому це працює) для 32-розрядних intнам, звичайно, доведеться використовувати ++2 ^ 32 рази, перш ніж це буде проблемою. З , --хоча це буде тільки в результаті , falseякщо б я почав зі значенням 1 для true, або почав з 0 і використовується ++точно одного разу.
Це інакше, якщо ми почнемо зі значення, яке трохи нижче 0. Дійсно, у такому випадку ми можемо захотіти ++в результаті отримати falseзначення, наприклад, у:
int x = -5;
while(++x)
doSomething(x);
Однак цей приклад трактується xяк intусюди, крім умовного, тому він еквівалентний:
int x = -5;
while(++x != 0)
doSomething(x);
Що відрізняється від використання лише xяк булева.