Это происходит из истории использования целочисленных значений в качестве логических.
Если x
есть int
, но я использую его как логическое значение согласно if(x)...
then, приращение будет означать, что независимо от его истинного значения перед операцией, оно будет иметь истинное значение 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
как логического.