Він походить з історії використання цілих значень як булевих значень.
Якщо 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
як булева.