Wie caste ich ordentlich int zu bool?
-
Hallo,
habe das immer bisher so gemacht
int i = 1; bool foo = (bool)i;
bei diesem cast kommen aber immer compiler warnungen. Geht das auch anständiger oder soll ich einfach die Warnings ignorieren?
-
Keine Ahnung, ob das eine gute Idee ist:
bool b = (i != 0);
-
Vielleicht so:
int i = 1; bool foo = (i != 0);
-
Wie soll es denn gecasted werden?
Wenn Du einfach das machst:
bool test; int a; ... test=a;
Wird test nur auf false gesetzt, falls der int-wert 0 ist.
Ok, dies ist nicht sauber.
-
warum nicht
int i = 1; bool foo = static_cast<bool>(i);
Wird test nur auf false gesetzt, falls der int-wert 0 ist.
Ok, dies ist nicht sauber.warum nicht? ist eine standardkonvertierung oder findest du es auch unsauber wenn man einem float einen integer zuweist?
also algemein: das ist ein cast den der compiler von selber ausführt, und zwar sauber!
-
int i=0; bla f() { int i=1; bool foo = static_cast<bool>(i); bool bar = static_cast<bool>(::i); }
-
@japro
einem float ein interger zuweisen, ist etwas anderes, da die Genauigkeit gleichbleibt (erhöht wird).Bei int zu bool gehen Informationen verloren.
Aber ok, habe mich da schlecht ausgedrückt.
-
daishi schrieb:
einem float ein interger zuweisen, ist etwas anderes, da die Genauigkeit gleichbleibt (erhöht wird).
Da irrst du dich. Auf handelsüblichen PCs haben int und float beide 32 bit, allerdings werden bei float 8bit davon für den Exponent verwendet, dh es bleiben nur 24bit übrig. In Wirklichkeit ist das natürlich komplizierter, aber schon allein von der Informationsmenge her kann das nicht hinkommen.
Du kannst ja mal testweise die Zahl 2000000001 (2 Milliarden und 1) in float und zurück in int umwandeln und gucken was rauskommt.
-
Ok,
ich hatte nicht beachtet, das beide 32Bit sind.
Mir war nur gerade dieser Fall eingefallen.int a; float b; a=1; b=a; //alles ok b=1.33; a=b; //Kompiler ... Verkuerzung von 'const double' in 'float'
-
wie wäre es mit sowas?
inline bool bool_cast (int value) { if (value <= 0) return (false); return (true); } // das müsste auch gehen (glaube ich :D) #define bool_cast (x) (x)?true:false
Ist zwar kein richtiger cast aber reicht doch
oda?
-
Hm, unnötig aufwendig ?
-
mag sein aber wenns net anders geht
auserdem ist bool_cast fast (*g*) genau so lang wie static_cast *g*
-
Knuddlbaer schrieb:
Hm, unnötig aufwendig ?
Und
bool b = (i != 0);
macht dasselbe.
-
Da steckt aber mehr dahinter:
Stackarbeiten
Prüfen
1 Wert zurück geben (kopie)
Stackarbeiten.Bei den anderen Lösungen ists , denk ich mal, nur:
Vergleichen und Ergebnis zuweisen.
-
Hi,
b = (i != 0); // oder b = !!i;
Wobei ich das zweite wesentlich schöner weil verständlicher finde.
EDIT: @Patrick: lol
ChrisM
-
Patrick schrieb:
// das müsste auch gehen (glaube ich :D) (x)?true:false
das ist gut
-
Da ihr ja nun alle so Herzaft über mein x?true:false; gelacht habt, testet es doch selber!
#include <iostream> using namespace std; int main (void) { int MyInt; cin >> MyInt; bool MyBool = (MyInt?true:false); if (MyBool == true) cout << "MyBool = true"; else cout << "MyBool = false"; return 0; }
funzt auf jedenfall. Ende aus und schluss, ist zwar kein Cast aber 1 zeile und keine Warnung/Error!
Ja es sind auch böse Abfragen drin, naund? kommt halt vor wenn es static_cast net schafft, geht denn davon der PC unter? nö! Und wenn das einem zu viel ist kann er ja mal im ASM forum fragen ;D;D;D
-
warum dieser aufwand? was spricht gegen ein normale zuweisung... DAS IST EIN STANDARDCAST... fangt ihr als nächstes an zu überlgen wie man in c++ klassen haben kann und beginnt dann irgendwelchen skurilen makros zu schreibe oder was?
-
was wenn static_cast einen warning ausspuckt? der sieht aber bei Opensource-Programmen net sehr schön aus
-
find ich eigentlich recht frech vom compiler, bei einem sowieo schon unsauberen c-cast?
wenn ich gute gründe habe und sowas mache:X y; Y x = (Y) y;
dann sollte mir der compiler schon soweit vertrauen, und hoffen, dass ich keinen blödsinn mache.