false und true



  • Entweder man verbietet beides oder erlaubt beides, ich verstehe den Unterschied noch nicht ganz.

    Naja. Das eine ist invariant gegenüber Wiederholung und das andere nicht.
    Da true alles ungleich null ist, kann man ein bool beliebig inkrementieren,
    das Ergebnis ist true. Egal ob du das hundert mal machts oder einmal.

    Beim dekrementieren müsstest man sich aber etwas einfallen lassen. Denn soll z.B.
    bool b = false;
    b++;
    b++;
    b--;

    true oder false ergeben?
    Oder was ist mit:
    bool b = false;
    b--;

    true oder false?

    Insofern denke ich schon, dass es sinn macht, das Dekrementieren von bools zu verbieten. Das Inkrementieren hat weniger Probleme, ist aber ebenfalls sehr fragwürdig und deshalb mittlerweile missbilligt.

    PS: Ob das wirklich der Grund dafür ist, dass -- auf bools nicht erlaubt ist, weiß ich natürlich nicht.

    PPS: C99 erlaubt übrigens sowohl Inkrement als auch Dekrement. Hier ist b-- (für bool b) immer gleich:
    b = !b;
    also das logische Komplement.



  • Da sind wir ja in eine düstere Ecke geraten, wenn selbst Du mit einem verhaltenen "Naja" beginnst. 😃



  • bool b = false;
    for(unsigned int i = 1; i < std::pow(2, sizeof(bool) * 8); i++)
      b++;
    // Kann folgendes Inkrement bei schlechten Compilern zum Überschreiten des Wertebereichs führen? 
    b++;
    


  • cd9000 schrieb:

    bool b = false;
    for(unsigned int i = 1; i < std::pow(2, sizeof(bool) * 8); i++)
      b++;
    // Kann folgendes Inkrement bei schlechten Compilern zum Überschreiten des Wertebereichs führen? 
    b++;
    

    bei schlechten compilern mag alles passieren.
    aber bei guten hat ein boot nur 0 oder 1 drin und sonst nix.
    bool(1+1)==1;

    man mache nämlich gerne

    bool a=veca.length();
    bool b=vecb.length();
    
    //und später sooft man mag
    if(a==b)
    


  • @RPD:
    Vielleicht hilt dir das beim Verständniss:

    An r-value of type Foo can be converted to an r-value of type int, with state "Cat" becoming one and any other state becoming zero.

    so einfach ist das...

    Das man jetzt schon zum Englischen greifen muss, um etwas verständlich zu machen ist echt tragisch.



  • HumeSikkins schrieb:

    Entweder man verbietet beides oder erlaubt beides, ich verstehe den Unterschied noch nicht ganz.

    Naja. Das eine ist invariant gegenüber Wiederholung und das andere nicht.
    Da true alles ungleich null ist, kann man ein bool beliebig inkrementieren,
    das Ergebnis ist true. Egal ob du das hundert mal machts oder einmal.

    Wenn ++b für jede interne Repräsentation von b true ist, muß der Compiler aufpassen, dass b nicht zufällig gerade genau die Repräsentation hat, die beim inkrementieren 0 ergibt (255 bei byte-großen bools.) Also kann er genausogut ++b als b=true ansehen. Und dann auch --b als b=false.

    Ein Zähler in der Art ++b; ++b; --b; // immer noch true wär daher nicht möglich, beim Überlauf würde ++b ja false ergeben, und das will der Standard anders haben.



  • @Helium
    hab trotzdem noch keinen compiler gesehen der aus true keine 1 macht.



  • RPD schrieb:

    @Helium
    hab trotzdem noch keinen compiler gesehen der aus true keine 1 macht.

    Wenn du mal genau liest, wirst du feststellen, dass Helium das gar nicht bestritten hat. Er weist lediglich auf den Unterschied zwischen "macht daraus eine 1" (bzw. standardesisch "wird zu 1 konvertiert") und "ist 1" hin.



  • boolalpha |

    true false <--



  • *nochmalgenaugelesen*
    jetzt hab ichs auch verstanden 💡
    *freu* 😃


Anmelden zum Antworten