FinalFantasy Geschrieben 2. Februar 2009 Geschrieben 2. Februar 2009 Hi, habe gerade Code entdeckt, der prinzipiel sowas hier macht: bool b = true; int i = 0; i += b;[/PHP] Nach meinem Verständnis ist sowas nicht so toll, da bool ja mit 0 = false und alles andere ist true definiert ist. Der Wert von i nach der Addition dürfte also undefiniert sein. Allerdings klappt das Konstrukt zumindest im Debug einwandfrei. Release hab ich jetzt nicht getestet. Was mich allerdings überrascht: Der VS2005 Compiler wirft hier nichtmal eine Warnung! Was haltet ihr davon? Sowas sollte man schon vermeiden, oder? Zitieren
VaNaTiC Geschrieben 2. Februar 2009 Geschrieben 2. Februar 2009 In meinen Augen gibt es nichtmal bei Code, der defintiv nur für eine Plattform+Compiler gedacht ist, einen Grund so zu programmieren. Zitieren
TDM Geschrieben 2. Februar 2009 Geschrieben 2. Februar 2009 Wenn man eine Liste mit Zweiwertelementen vergleicht, kann man so z.B. gut prüfen, wieviel sich unterscheiden. Aber so programmieren würd ich auch nicht. Das hat sicher was damit zu tun, dass es in C keinen bool-Datentyp gibt... Zitieren
Guybrush Threepwood Geschrieben 2. Februar 2009 Geschrieben 2. Februar 2009 Nach meinem Verständnis ist sowas nicht so toll, da bool ja mit 0 = false und alles andere ist true definiert ist. Der Wert von i nach der Addition dürfte also undefiniert sein. int i=true; ergibt immer das i den Wert 1 hat Ich weiß nicht wie der genaue Wortlaut im Standard (um welche Sprache geht es eigentlich?) ist aber festegelt ist das false = 0 ist und true != false. Daraus ergibt sich zwar das true jeder Wert außer 0 sein könnte, aber das ist zumindest für den Compiler nur andersherum der Fall. Das heißt jeder Wert außer 0 ist true, aber true ist == 1 Zitieren
Klotzkopp Geschrieben 2. Februar 2009 Geschrieben 2. Februar 2009 Ich weiß nicht wie der genaue Wortlaut im Standard (um welche Sprache geht es eigentlich?)Kann ja nur C++ sein. bool gibt's in C nicht Der Final Draft schreibt in 4.5.4: An rvalue of type bool can be converted to an rvalue of type int, with false becoming zero and true becoming one. Wohldefiniert und damit portabel ist das also. Trotzdem finde ich if( ++i;[/code] besser lesbar, vor allem auch deshalb, weil es ohne dieses Spezialwissen verständlich ist. Ein halbwegs moderner Compiler dürfte daraus sowieso denselben Code erzeugen. Zitieren
FinalFantasy Geschrieben 2. Februar 2009 Autor Geschrieben 2. Februar 2009 Es geht um C++. War mir gar nicht bewusst, dass es hier einen Unterschied zu C gibt. :beagolisc Okay, also könnte man sich funktional auf den Code verlassen, aber es ist unschön. Ich bin immer davon ausgegangen, dass true alles ausser 0 sein kann, da bool ja intern wie ein int behandelt wird. Zitieren
Klotzkopp Geschrieben 2. Februar 2009 Geschrieben 2. Februar 2009 Es geht um C++. War mir gar nicht bewusst, dass es hier einen Unterschied zu C gibt. :beagolisc Dazu empfehle ich folgende Seite: Incompatibilities Between ISO C and ISO C++ Ich bin immer davon ausgegangen, dass true alles ausser 0 sein kann, da bool ja intern wie ein int behandelt wird.Der Standard legt nicht fest, wie bool "intern" behandelt wird. Du musst hier zwischen zwei unterschiedlichen Konvertierungen unterscheiden: Von arithmetisch/enum/pointer nach bool (4.12.1): 0/NULL ist false, alles andere true.Von bool nach int (4.5.4): false ist 0, true ist 1. Zitieren
FinalFantasy Geschrieben 2. Februar 2009 Autor Geschrieben 2. Februar 2009 Hmm, so hab ich das noch gar nicht gesehen. Danke für die Hinweise. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.