Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

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?

Geschrieben

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...

Geschrieben

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 ;)

Geschrieben

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(B) ++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.

Geschrieben

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.

Geschrieben
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.

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...