Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

11

09.04.2013, 17:27

Jau, danke für die Tipps, aber 1) ist das nicht mein Code 2) wo ist das Überproblem mit bool foo = 1 außer dass es vielleicht nicht sehr sauber ist? 3) es kann doch sein, dass es noch Erben gibt, die diese Funktion überschreiben ;)

simbad

unregistriert

12

09.04.2013, 17:57

Na ich mach das schon deshalb nicht, weil es einfach nicht stimmt.
1 ist eine Zahl und ein bool kann eben nur true oder false sein.
Das dort eine implizite Typ-Konversion stattfindet ist eine ganz andere Geschichte.

Aus den Ur-Tagen des Programmierens weiß man, das eigentlich nur false eindeutig als 0 definiert ist und true als ungleich false.
Diese etwas abartig wirkende Betrachtung kommt davon, das oft die negation von 0 in einer CPU schneller ausgeführt werden konnte als z.B. ein increment oder gar ein Zweierkomplement.
Um das dem Compiler-Hersteller zu überlassen, wie am effektivsten true und false dargestellt werden, damit das auch die CPU am effektivsten abhandeln kann, hat man, wahrscheinlich eher als ungeschriebene aber durchaus sinnvolle Regel, es auf obige Weise gelöst.

Das waren noch Zeiten.

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

13

09.04.2013, 19:25

Das waren noch Zeiten.


Das sind auch heute noch Zeiten. true ist nach meinem Wissen nur als "nicht 0" definiert, kann aber jeden verdammten Wert annehmen, den der Compiler für geeignet hält. Wenn Du irgendwo sowas hinschreibst:

Quellcode

1
2
3
 bool bla = TuWas();
if( bla == 1 )
  MachWas();


kann das je nach Compiler, Tagesform und Mondstellung tatsächlich scheitern. Ich hab den Standard jetzt nicht im Kopf, ob nun die Zahl zu bool oder der bool zu int gecastet wird, aber das muss ich ja auch nicht. Es ist und bleibt halt falsch.
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

14

09.04.2013, 20:30

Laut Standard wird bool in int gecastet und es gilt:

Zitat von »C++ Std. §4.7.4«

[...] the value false is converted to zero and the value true is converted to one.


EDIT: Standrad hat was...
"Theory is when you know something, but it doesn’t work. Practice is when something works, but you don’t know why. Programmers combine theory and practice: Nothing works and they don’t know why." - Anon

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

15

09.04.2013, 21:01

Und andersherum? Denn das wäre dann erst das, was Schrompf beschrieben hat.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

16

09.04.2013, 21:39

Zitat von »§4.12«

A zero value, null pointer value, or null member pointer value is converted to false; any other value is converted to true.


Allerdings ist diese Regel im genannten Quelltext irrelevant, da gilt nochmal explizit:

Zitat von »§4.5.6«

A prvalue of type bool can be converted to a prvalue of type int, with false becoming zero and true
becoming one.
"Theory is when you know something, but it doesn’t work. Practice is when something works, but you don’t know why. Programmers combine theory and practice: Nothing works and they don’t know why." - Anon

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

17

10.04.2013, 07:02

Also wird der Ausdruck links (der bool) in den Typ des Ausdrucks rechts konvertiert? Ich hätte gedacht es sei andersrum.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

18

10.04.2013, 11:35

Links und rechts spielt (in diesem Fall) keine Rolle. Es kommt nur auf die Typen an.
"Theory is when you know something, but it doesn’t work. Practice is when something works, but you don’t know why. Programmers combine theory and practice: Nothing works and they don’t know why." - Anon

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

19

10.04.2013, 11:50

Bei VS gab es dann immer so eine Warnung. "Implizite Konvertierung von Integer in bool - Auswirkung auf Performance-Verhalten möglich." Ich habe lange nicht verstanden, was die mir damit eigentlich sagen wollen. Aber ich glaube, es meint: "Wenn Du hier wirklich eine 1 und zwar genau nur eine 1 haben willst, muss der Compiler zusätzliche Logik einfügen. Das kostet Rechenzeit. Also lass es bitte."

Aber ich bin ja kein Compiler-Psychologe.
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

simbad

unregistriert

20

10.04.2013, 12:06

Es ist einfach im Zuge des "richtig programmieren lernen" schlecht sich so einen Murks anzugewöhnen. Denn programmieren können hat wenig mit der verwendeten Programmiersprache zutun. Wenn ich nur mal an C denke, das eher einem highlevel assembler nahe kommt, und wo es bool als typen garnicht gibt, dann ist wird es einfach wichtig, das man sich, vor allem an solchen trivialen Stellen, an die verwendeten Datentypen hält.
Viele Fehler entstehen aus einem Missverständnis zwischen dem Programmierer und der verwendeten Programmiersprache.
Der Compiler hat dabei immer recht, auch wenn er sich nicht wie erwartet oder wie per Standard definiert verhält. Denn am Ende soll ein funktionsfähiges Programm rauskommen.

Werbeanzeige