Logisch NOT !
Der Logisch-NOT-Operator wandelt einen boolschen Wert in sein Gegenteil um: Aus false wird true und umgekehrt.
|
|
Siehe auch bool-Typ, Bitweise-NOT-Operator ~, Logisch-AND-Operator &&, Logisch-OR-Operator ||
Details
Der Logisch-NOT-Operator erwartet einen Operanden als rvalue und wird von rechts nach links abgearbeitet. Der Rückgabewert ist ein rvalue, in C ein Integer-Typ, in C++ ein boolscher Typ.
Der Operator ist zulässig für boolsche Werte, Integer-Werte, Fliesskommawerte sowie Pointer. Zwar ist dieser Operator bereits in C verfügbar, jedoch sind der Typ bool sowie die Wahrheitswerte true und false erst ab C++ verfügbar. In C wird für den Wert false der Integer-Wert 0, für true ein Integer-Wert ungleich 0 (normalerweise 1) verwendet.
Der Rückgabewert des Operators kann nur entweder true oder false (oder die entsprechenden Integer-Werte in C) sein. Im Gegensatz dazu gibt der Bitweise-NOT-Operator stets einen Integer-Wert zurück.
Der Unterschied zwischen der logischen und der bitweisen Variante des NOT-Operators ist für Einsteiger in die Sprache manchmal schwer verständlich. Der Unterschied ist: Die logische Variante verändert 1-Bit-Werte, die bitweise Variante verändert alle Bits von Werten. Selbst bei erfahrenen Programmierern kommt es vor, dass man aufgrund der ähnlichen Schreibweise (! oder ~) aus Versehen und ohne es zu merken den falschen Operatoren verwendet. Da zudem in gewissen Fällen (beispielsweise bei der Anwendung des Operators auf den Wert -1) die beiden Operatoren dieselben Ergebnisse liefern, ist dies eine schwer aufzufindende Fehlerquelle, die manchmal einige Stunden Fehlersuche benötigt.
Überladen des Operators
Der Logisch-NOT-Operator hat grundsätzlich die semantische Bedeutung einer boolschen Verneinung. Die Überladung des Operators wird auch häufig verwendet, wenn allgemein über zwei Zustände eines Objektes entschieden werden soll. Allerdings ist auch jegliche andere Semantik vom Programmierer definierbar. Trotzdem sei angemerkt, dass der Logisch-NOT-Operator selten überladen wird, insbesondere, da oftmals anstelle der expliziten Ausprogrammierung eines logischen Vergleiches ein Casting-Operator nach bool überladen wird, worauf mit dem eingebauten Logisch-NOT-Operator weiterprogrammiert werden kann.
Die Prototypen für das Überladen des Logisch-NOT-Operators sind die folgenden (Einschränkungen und Erläuterungen siehe Überladen von Operatoren):
|
|
Im folgenden Beispiel wird eine Klasse präsentiert für eine 2x2 Matrix. Der überladene Logisch-NOT-Operator gibt hier die Transposition der Matrix zurück.
|
|