W dawnych czasach C nie było typu logicznego. Ludzie używali int
do przechowywania danych logicznych i działało to głównie. Zero było fałszywe, a wszystko inne było prawdą.
Oznaczało to, że gdybyś wziął, int flag = 0;
a później zrobił, flag++
wartość będzie prawdziwa. Działa to bez względu na wartość flagi (chyba że dużo to zrobiłeś, przewrócił się i wróciłeś do zera, ale zignoruj to) - zwiększenie flagi, gdy jej wartość wynosiła 1, dałoby 2, co wciąż było wartością prawdziwe.
Niektóre osoby wykorzystały to do bezwarunkowego ustawienia wartości boolowskiej na true. Nie jestem pewien, czy kiedykolwiek stał się idiomatyczny , ale jest w jakimś kodzie.
To nigdy nie zadziałało --
, ponieważ gdyby wartość była inna niż 1 (która mogłaby być), wartość nadal nie byłaby fałszywa. A jeśli to było już false ( 0
) i wykonałeś na nim operator dekrementacji, nie pozostanie on fałszywy.
Podczas przenoszenia kodu z C do C ++ na początku bardzo ważne było, aby kod C zawarty w C ++ był nadal w stanie działać. I tak w specyfikacji dla C ++ (sekcja 5.2.6 (na stronie 71)) czytamy:
Wartość uzyskana przez zastosowanie Postfiksa ++ jest wartością, którą operand miał przed zastosowaniem operatora. [Uwaga: uzyskana wartość jest kopią pierwotnej wartości] Operand będzie wartością modyfikowalną. Typ argumentu powinien być typem arytmetycznym lub wskaźnikiem do pełnego typu obiektu. Po zanotowaniu wyniku wartość obiektu jest modyfikowana przez dodanie do niego 1, chyba że obiekt jest typu bool
, w którym to przypadku jest ustawiony na true. [Uwaga: to zastosowanie jest przestarzałe, patrz załącznik D.]
Argument postfix - jest dekrementowany analogicznie do operatora postfix ++, z tym wyjątkiem, że operand nie jest typu bool
.
Jest to ponownie wspomniane w sekcji 5.3.2 (dla operatora prefiksu - 5.2.6 był na postfiksie)
Jak widać, jest to przestarzałe (załącznik D w dokumencie, strona 709) i nie należy go używać.
Ale właśnie dlatego. Czasami możesz zobaczyć kod. Ale nie rób tego.