PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : logischer Vergleich und Casting in C++



yucosuma
24-07-2006, 19:47
Hi,

in meinem Softwarepraktikum in C++ hatte ich ein kleines Problem, mitlerweile ist es zwar gelöst, aber mich interessierts trotzdem:

Und zwar habe ich einen Vergleich einer long double und einer integer-Zahl gemacht der Form



long double v;
if v < 0
{...}


Das Problem dabei war, die Variable v war entweder positiv oder sie war im Bereich zwischen +10^-5 und -10^-5, also knapp um die Null rum. War sie negativ, dann sollte eine Fehlermeldung ausgegeben werden. Nun wurde mit meinem g++-Compiler (g++ (GCC) 3.3.5 mit Linux 9.3 bzw. Linux 10.1) nie eine Fehlermeldung ausgegeben, da die Variable v anscheinend als Integer gecastet wurde und damit immer automatisch auf Null gerundet wurde. Auf einem anderen PC (ebenfalls g++ (GCC), Version unbekannt, aber auch sehr neu, mit Linux 10.1) wurde hingegen eine Fehlermeldung ausgegeben wenn die Variable v negativ war, hier wurde anscheinend nicht auf integer gecastet und somit nicht zur Null gerundet.

Wie sieht denn der Standard aus beim Vergleich zweier unterschiedlicher Datentypen? Soweit ich weiß, wird der "kleinere" Datentyp (hier int mit 0) zum "größeren" Datentyp (hier long double) gecastet, das Verhalten des zweiten PCs mit der Ausgabe der Fehlermeldung war also ok, warum gibt nun mein PC keine Fehlermeldung aus und castet hier beides zu integer bzw. tut etwas anderes, jedenfalls ohne Fehlermeldung?

Vielleicht kann mir das jemand erklären, hab da nämlich ein kleines Verständnisproblem :o

Vielen Dank schonmal.

yucosuma

panzi
24-07-2006, 19:50
Linux 10.1? Was soll das sein? Ich bin erst bei 2.6.x? Du meinst sicher die Versionsnummer irgendeiner Distribution? Welche Distri meinst du? Und wenn du dir nicht sicher bist wie gecastet wird, caste manuell!

yucosuma
24-07-2006, 20:25
Sorry, meinte natürlich bei den Versionsangaben immer SuSE, also SuSE 9.3 und 10.1.

Ich bin mir durchaus bewusst wie man explizit castet und was es bewirkt. Hier geht es ums implizite Casten, also das, was der Compiler automatisch tut. Ich schrieb ja bereits, dass ich das Problem gelöst habe (durch explizites Casten), warum aber hier auf verschiedene Arten implizit gecastet wurde interessiert mich doch mal.

panzi
25-07-2006, 00:06
Sorry, meinte natürlich bei den Versionsangaben immer SuSE, also SuSE 9.3 und 10.1.

Ich bin mir durchaus bewusst wie man explizit castet und was es bewirkt. Hier geht es ums implizite Casten, also das, was der Compiler automatisch tut. Ich schrieb ja bereits, dass ich das Problem gelöst habe (durch explizites Casten), warum aber hier auf verschiedene Arten implizit gecastet wurde interessiert mich doch mal.
Mhm, ja. Wär sicher auch interessant. Aber ich würde bei so sachen immer leiber explizit casten, um mir ganz sicher zu sein was passiert. Könnte ja auch sein das ein anderer Compiler es anders macht, bzw. das gcc es aus irgendeinem Grund in Version X nicht standardkonform macht, aber in einer neueren schon. All das kann zu Problemen führen die man bei expliziten casts nicht hat.

oracle2025
25-07-2006, 09:22
kompilier mit -Wall -Werror, dann kommt sowas gar nicht durch. ;)

Ich mach das immer.

yucosuma
26-07-2006, 23:09
Das stimmt, da meckert er dann wegen einem Vergleich von Zahlen mit unterschiedlichen Datentypen. Naja, ich glaub, ich akzeptier das einfach so und caste in Zukunft explizit, dann passiert sowas nicht.