Это происходит из истории использования целочисленных значений в качестве логических.
Если 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как логического.