000
10.01.2003, 15:41 Uhr
void*
Generic Pointer (Operator)
|
Wenn zwei Variablen verschiedener Datentypen verknüpft werden (vorausgesetzt zwischen den 2 Datentypen ist eine Verknüpfung definiert) ist das Ergebnis vom genaueren Typ. Werden 2 Variablen vom gleichen Typ verknüpft, ist das Ergebnis natürlich genau von diesem. Beispiel:
C++: |
int a=3, c; float b=1.5, d; d=a*b; // d hat jetzt den Wert 4.5 c=a*b; // c hat jetzt den Wert 4
|
Bei der Zuweisung c=a*b; wird der Compiler eine Warnung ausgeben, da Genauigkeit verloren geht. Achtung: Geht Genauigkeit verloren wird nicht gerundet sondern ABGESCHNITTEN! Dieses Beispiel läßt sich mit printf veranschaulichen:
C++: |
printf("%f",(a*b)); // Gibt eine Ausgabe 4.500000 printf("%i",(a*b)); // Ausgabe: 0.000000 -> Das Ergebnis ist kein int!!!
|
Das Ergebnis von c=a*b; kann jedoch auch so gewünscht sein(als int. Daher gibt es in C den cast-Operator. Er hat die Form: (type)Ausdruck Ausdruck kann nun eine Variable sein oder auch eine definierte Verknüpfung von Variablen. Wegen besserer Lesbarkeit empfiehlt es sich (type)(Ausdruck) zu schreiben. Auf unser voriges Beispiel angewendet
C++: |
c=(int)(a*b); // Die Compiler Warnung bleibt aus, da explizit mitgeteilt wurde, // daß das Ergebnis ein int sein soll.
|
Dies mag nun nicht so wichtig erscheinen! Man könnte diese Warnung ja auch einfach ignorieren, da man sich der Gefahr ja bewußt ist und der erzielte Effekt so gewünscht ist. Nun aber ein Beispiel in dem man den cast-Operator unbedingt braucht: Beispiel:
C++: |
int a=7, b=4; float c; c=7/4;
|
7/4: das Ergebnis dieser Operation ist ein int. Und dieses lautet 1. Also steht in c 1.000000. Was macht also der schlaue C-Programmierer? Er benutzt den cast-Operator: c=(float)7/4; cast-Operator hat höchste Bindung!!! Übersichtlicher:
C++: |
c=(float)(7)/4; // Und nun steht in c 1.750000.
|
Achtung! Falsch wäre:
C++: |
c=(float)(7/4); // Denn nun steht in c 1.000000! 7/4 ist int -> Ergebnis 1 -> cast // in float -> 1.000000
|
Es ist aber trotztdem zu empfehlen IMMER zu casten -> Lesbarkeit des Codes (insbesondere bei langem Code)! Beispiel:
C++: |
int a=3; float c; c=(float)(a);
|
Bemerkung: Der explizite cast bedeutet keinen Verlust von Performance, da er sowieso durchgeführt werden muß!!! -- Gruß void* Dieser Post wurde am 10.01.2003 um 15:42 Uhr von void* editiert. |