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