Frage zu if()



  • Hallo,
    ich lese gerade wieder mal im Primer und da ist mir aufgefallen, dass dort folgendes gemacht wird, natürlich mit ein wenig mehr Sinn 😉 :

    int integer;
    std::cin>>integer;
    
    if(integer)
    return 10/integer;
    else
    return 0;
    

    Ich verstehe dieses so, dass sie nicht wollen, dass durch 0 geteilt wird.
    Nur dachte ich immer, dass:

    if(integer) = if(integer == 1)
    und
    if(!integer) = if(integer == 0)
    

    Nur kann dies ja nicht mehr sein, es muss (nach dem Primer 🙂 ) so heißen:

    if(integer) = if(integer != 0)
    oder
    if(integer) = if(integer > 0)
    

    Habe ich immer falsch gelegen oder bin ich einfach nur ein wenig durcheinander gekommen?

    Gruß Speedy_92



  • false = 0
    true = alles andere



  • Vielen Dank.
    Ist true auch negativ?



  • Speedy_92 schrieb:

    Vielen Dank.
    Ist true auch negativ?

    Ja.



  • Einerseits werden (schon nur aus C-Kompatibilität) alle integralen Werte ausser 0 als true aufgefasst, wenn es um einen boolschen Ausdruck geht. Andererseits, wenn du explizit true schreibst, z.B. so:

    long i = true;
    

    , dann wird für true der Wert 1 eingesetzt.

    true ist also genau genommen nicht negativ, aber Negatives kann true sein 😉



  • Nexus schrieb:

    Einerseits werden (schon nur aus C-Kompatibilität) alle integralen Werte ausser 0 als true aufgefasst, wenn es um einen boolschen Ausdruck geht. Andererseits, wenn du explizit true schreibst, z.B. so:

    long i = true;
    

    , dann wird für true der Wert 1 eingesetzt.

    true ist also genau genommen nicht negativ, aber Negatives kann true sein 😉

    Den Spruch merke ich mir 😉



  • Genau das ist es was man verstehen muss.
    Erst einmal wird 0 und 1 definiert als Wahrheitswert.
    0 = Strom aus = False
    1 = Strom ein = True

    Das Problem bei der Prüfung ist hier natürlich, das man nur auf 0 und 1 testen könnte.
    Man sagt also (Definition) das 0 = False und !0 = True ist.
    -5 ist < 0. Das heißt doch, es ist ungleich 0, und somit wahr.
    Die Rückgabe der Auswertung als Wahrheitswert folgt nach der Definition.

    Doch Vorsicht bei unterschiedlichen Datentypen (explizite Umwandlung)

    int a = -1;
    unsigned int b = 0;
    
    if(b < a) {
        // b ist der Operand der verglichen werden soll mit a
        // a wird somit umgewandelt nach unsigned int
        // -1(int) nach uint ergibt uint(max) [Überlauf]
    }
    


  • Versuch einfach if (integer) zu vermeiden. Mach es explizit und du bist immer auf der sicheren Seite.



  • Ponto schrieb:

    Versuch einfach if (integer) zu vermeiden. Mach es explizit und du bist immer auf der sicheren Seite.

    Würde ich auch raten. Wahrscheinlich wird das eh rausoptimiert, wenn man noch ein != 0 hineinschreibt, im Gegenzug weiss man gerade, dass es um einen Vergleich von Ganzzahlen geht.

    Bei dem hier sollte man eigentlich eine Warnung erhalten:

    int a = -1; 
    unsigned int b = 0; 
    
    if(b < a)
        // ...
    

Anmelden zum Antworten