Wie caste ich ordentlich int zu bool?



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



  • Da könnte man auch dagegenhalten, dass jemand, der weiß was er tut, keine C-Casts verwendet 😉



  • :p gilt aber auch für andere casts.
    der compiler sollte einfach davon ausgehen, dass er dem programmierer vertrauen kann



  • Dann muss man einfach alle Warnungen deaktivieren 😉



  • ich verstehe die ganze Diskussion garnicht...

    int i;
    bool b = i;

    compiliert mir der g++ ohne Warnung (mit -W -Wall), und ich wüsste auch nicht wieso das irgendein Compiler nicht machen sollte 😕



  • das sage ich ja schon die ganze zeit... aber wenn wir schonmal dabei sind wie wärs wenn man schleifen mithilfe von gotos und makros implementiert... es scheint ja mode zu sein umständliche lösungen zu suchen für probleme die es garnicht gibt...



  • personenkult hat das Problem aber anscheinend.



  • personenkult schrieb:

    habe das immer bisher so gemacht

    int i = 1;
    bool foo = (bool)i;
    

    klar gibt das ein "problem" weil sich der compiler am c style cast stört. aber wenn man den weg lässt gibt es da nix mehr zu motzen...



  • Das ist dann aber ein ziemlich dummer Compiler. Ein Cast signalisiert doch eher, dass man grad weiß was man tut, als eine implizite Umwandlung.



  • japro schrieb:

    personenkult schrieb:

    habe das immer bisher so gemacht

    int i = 1;
    bool foo = (bool)i;
    

    klar gibt das ein "problem" weil sich der compiler am c style cast stört. aber wenn man den weg lässt gibt es da nix mehr zu motzen...

    naja bei den code gibt glaube ich der vc ne warnung aus die in etwa 'wieso machst du i nicht gleich zu ein bool' lautet (natürlich in einer unverständlichen form)



  • @Patrick:

    Das lustige an Deiner Lösung ist, daß Du zuerst einen int implizit in einen bool umwandelst, um dann anhand dessen die Entscheidung zu treffen, ob true oder false rauskommt...
    Du könntest also genausogut

    bool MyBool = MyInt; schreiben
    wahrscheinlich wird sogar der gleiche Code generiert...

    MfG Jester



  • Hi,

    @Patrick: Mein "lol" bezog sich hierdrauf:

    inline bool bool_cast (int value) 
    { 
        if (value <= 0) 
            return (false); 
        return (true); 
    }
    

    Und das ist ja jetzt wirklich der größte Quatsch in dem ganzen Thread hier (von der Geschwindigkeit hier).

    ChrisM



  • Hallo,

    wenn 'value' -1 is, gibst du false zurueck, was aber falsch ist.

    mfg
    v R



  • Wußte nicht das man über ein "i!=0" soviel text schreiben kann - aber jetzt hau ich meinen senf auch noch rein (Bautzner, extrascharf):

    der code für "bool_cast" ist zwar falsch (wenn man von der zu werwartenden konvertierung ausgeht), aber nicht zwingend langsamer. selbst ein mittelmäßiger Optimizer kann das auf die selbe anzahl von Clocks reduzieren wie ein "i!=0"

    DAS IST EIN STANDARDCAST

    der aber leider nicht das verhalten hat, das man evtl. erwartet. Deswegen ja die Warnung.

    DrGreenthumb:
    Das dein Compiler das ohne Warnung macht, heißt noch gar nix.
    mein compiler sagt zu

    int * i = NULL; *i = 10;
    

    auch nix.


Anmelden zum Antworten