Dlaczego operator --
nie istnieje dla bool, a dla operatora ++
?
Próbowałem w C ++ i nie wiem, czy moje pytanie dotyczy innego języka. Będę również szczęśliwy.
Wiem , że mogę używać operatora ++
z boolem. To sprawia, że każdy bool jest równy prawdzie.
bool b = false;
b++;
// Now b == true.
Dlaczego nie możemy używać operatora --
w odwrotny sposób?
bool b = true;
b--;
// Now b == false;
Nie jest to zbyt przydatne, ale jestem ciekawy.
Odpowiedzi:
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:
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.
źródło
Aby częściowo poradzić sobie ze starszym kodem, który używał
int
lub podobny jako typ logiczny.źródło
Aby zrozumieć historyczne znaczenie tego pytania, należy rozważyć przypadek Therac-25. Therac-25 był urządzeniem medycznym, które zapewniało promieniowanie pacjentom chorym na raka. Nękane były złymi praktykami programowania, które przyczyniły się do złych wyników w zakresie bezpieczeństwa (przypisano mu wiele zgonów).
http://courses.cs.vt.edu/professionalism/Therac_25/Therac_1.html
(przejdź na dół strony 3)
Therac-25 użył czegoś w rodzaju odpowiednika
operator++
nabool
. Jednak używanym językiem programowania nie był C ++, a ich typ danych niebool
. Jednak w przeciwieństwie do gwarancji w C ++ zwykła liczba całkowita po prostu rośnie. Ich typ danych był równoważnyuint8_t
.C ++ postanowił zachować
operator++
ostrożność dla osób przyzwyczajonych do programowania w ten sposób, ale zamiast zwiększać wartość, po prostu ustawia ją,true
aby zapobiec takim rzeczom.Uwaga:
operator++(bool)
jest przestarzała.http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3797.pdf
Załącznik D do C ++ 14:
źródło
bool
typem. Chciałem tylko podać historyczny przykład tego, kiedy ludzie tak zaprogramowali.