Warum --
existiert der Operator nicht für bool, wohingegen er für operator existiert ++
?
Ich habe es in C ++ versucht und weiß nicht, ob meine Frage auf eine andere Sprache zutrifft. Ich werde es auch gerne wissen.
Ich weiß , ich kann den Operator ++
mit einem Bool verwenden. Es macht jeden Bool gleich wahr.
bool b = false;
b++;
// Now b == true.
Warum können wir den Operator nicht anders verwenden --
?
bool b = true;
b--;
// Now b == false;
Es ist nicht sehr nützlich, aber ich bin neugierig.
Antworten:
In den alten Tagen von C gab es keinen Booleschen Typ. Die Leute verwendeten die
int
zum Speichern von Booleschen Daten, und es funktionierte meistens. Null war falsch und alles andere war wahr.Dies bedeutet, wenn Sie eine nehmen
int flag = 0;
und später tunflag++
, wäre der Wert wahr. Dies würde funktionieren, unabhängig davon, wie hoch der Wert von flag war (es sei denn, Sie haben es häufig getan, es hat sich gedreht und Sie sind auf Null zurückgekehrt, aber ignorieren wir das) - Erhöhen des Flags, wenn sein Wert 1 war, würde 2 ergeben, was immer noch war wahr.Einige Leute benutzten dies, um einen booleschen Wert bedingungslos auf true zu setzen. Ich bin nicht sicher, ob es jemals idiomatisch wurde , aber es ist in irgendeinem Code.
Dies hat nie funktioniert
--
, denn wenn der Wert nicht 1 ist (was auch immer sein könnte), ist der Wert immer noch nicht falsch. Und wenn es bereits false (0
) war und Sie einen Dekrementierungsoperator dafür durchgeführt haben, würde es nicht false bleiben.Bei der Verlagerung von Code von C nach C ++ in den Anfängen war es sehr wichtig, dass der in C ++ enthaltene C-Code weiterhin funktioniert. Und so heißt es in der Spezifikation für C ++ (Abschnitt 5.2.6 (auf Seite 71)):
Dies wird erneut in Abschnitt 5.3.2 erwähnt (für den Präfix-Operator - 5.2.6 war auf Postfix).
Wie Sie sehen, ist dies veraltet (Anhang D im Dokument, Seite 709) und sollte nicht verwendet werden.
Aber deshalb. Und manchmal können Sie den Code sehen. Aber tu es nicht.
quelle
Teilweise Bewältigung von Legacy-Code, der
int
als Boolescher Typ verwendet wird.quelle
Um die historische Bedeutung dieser Frage zu verstehen, müssen Sie den Fall des Therac-25 betrachten. Der Therac-25 war ein medizinisches Gerät, das Krebspatienten mit Strahlung versorgte. Es wurde von schlechten Programmierpraktiken geplagt, die zu seiner schlechten Sicherheitsbilanz beitrugen (mit mehreren Todesfällen, die darauf zurückgeführt wurden).
http://courses.cs.vt.edu/professionalism/Therac_25/Therac_1.html
(gehe zum Ende von Seite 3)
Der Therac-25 verwendete so etwas wie
operator++
einenbool
. Die von ihnen verwendete Programmiersprache war jedoch nicht C ++, und ihr Datentyp war nicht C ++bool
. Im Gegensatz zur Garantie in C ++ bleibt ein regulärer Integer-Typ jedoch einfach bestehen. Ihr Datentyp war das Äquivalent vonuint8_t
.C ++ hat beschlossen, die
operator++
Umgebung für Programmierer wie diese zu behalten , aber anstatt den Wert zu erhöhen, wird er einfach so eingestellttrue
, dass solche Dinge vermieden werden.Beachten Sie, dass dies
operator++(bool)
veraltet ist.http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3797.pdf
Anhang D von C ++ 14:
quelle
bool
Typ. Ich habe nur versucht, ein historisches Beispiel dafür zu geben, wann die Leute tatsächlich so programmiert haben.