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.

Erstelle ein Benutzerkonto oder melde Dich an, um zu kommentieren

Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können

Benutzerkonto erstellen

Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!

Neues Benutzerkonto erstellen

Anmelden

Du hast bereits ein Benutzerkonto? Melde Dich hier an.

Jetzt anmelden

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