Negativ -
Der Negativ-Operator dient der expliziten Negierung eines Elementes und wird in C auch mit unary minus bezeichnet. Er wird stets vor das zu kennzeichnende Element geschrieben, beispielsweise -value oder -1000.
#include <stdio.h>
int main(int argc, char** argv){
int pos = 1000;
int neg = - 1000;
printf("%d\n", pos);
printf("%d\n", - pos);
printf("%d\n", neg);
printf("%d\n", - neg);
return 0;
} |
1000
-1000
-1000
1000
|
Siehe auch Positivoperator +
Details
Der Negativ-Operator erwartet einen Operanden als R-Wert und wird von rechts nach links abgearbeitet.
Die semantische Bedeutung der Negierung ist die Multiplikation mit -1. Dies entspricht dem Zweierkomplement bei integralen numerischen Typen wie signed int, signed short und signed char.
Folgende Konstrukte sind nur begrenzt sinnvoll, jedoch möglich:
printf("%d\n", - - pos);
printf("%d\n", - - neg);
printf("%d\n", - - - - - - - pos); | 1000
-1000
-1000
|
Vorsicht: Folgende Zeile sieht zwar fast gleich aus, allerdings handelt es sich aufgrund des fehlenden Abstandes zwischen den den beiden - hier um den Decrement-Operator, welcher die Variable verändert:
printf("%d\n", -- pos); | 999 |
Dieser Unterschied ist jedoch hinfällig, wenn der Negativ-Operator gemischt mit dem Positiv-Operator auftritt, da ein solcher Operator nicht existiert und somit als jeweils einzelne Positiv- und Negativ-Operatoren aufgelöst wird:
printf("%d\n", - + pos);
printf("%d\n", -+ pos);
printf("%d\n", + - pos);
printf("%d\n", +- pos); | -1000
-1000
-1000
-1000 |
Überladen des Operators
Für eigene Klassen ist es notwendig, den Negativ-Operator zu definieren, denn die oben angesprochene Multiplikation mit -1 ist nur die semantische Bedeutung und wird nicht wirklich so übersetzt. Selbst kreierte Klassen müssten hierfür theoretisch ein 1-Element definieren, was jedoch in C++ so direkt nicht möglich ist, sondern nur über den Negativ-Operator. Wird somit der Negativ-Operator an einem Objekt aufgerufen, das keinem eingebauten Typ entspricht, erhält man den Fehler error: no match for 'operator-' in ... .
Die Prototypen für das Überladen des Negativ-Operators sind die folgenden:
AnyType operator -();
AnyType operator -() const;
AnyType operator -(Type m);
AnyType operator -(Type& m);
| Innerhalb der Klasse
Ausserhalb der Klasse
|
Der Rückgabewert ist beliebig. Vorsicht ist geboten bei den Prototypen ausserhalb der Klasse, sie werden von den Compilern nicht als Fehler erkannt, wenn sie innerhalb der Klasse stehen, da sie den Prototypen des Subtrations-Operators entsprechen.
Hier ein Beispiel, in dem eine Matrix mit dem Negativ-Operator direkt negiert werden kann:
#include <cstdio>
class Matrix22{
float a[4];
public:
Matrix22(float d){a[0]=d; a[1]=0; a[2]=0; a[3]=d;}
Matrix22(float a0, float a1, float a2, float a3){
a[0]=a0; a[1]=a1; a[2]=a2; a[3]=a3;
}
void print(){
printf("%f\t%f\n%f\t%f\n\n", a[0], a[2], a[1], a[3]);
}
Matrix22 operator -() const {
return Matrix22(-a[0], -a[1], -a[2], -a[3]);
}
};
int main(int argc, char** argv){
Matrix22 m(1);
m.print();
(-m).print();
m.print();
return 0;
} |
1.000000 0.000000
0.000000 1.000000
-1.000000 -0.000000
-0.000000 -1.000000
1.000000 0.000000
0.000000 1.000000
|
|