false und true



  • ein bool kann true oder false sein. alle drei sind schlüsselwörter.
    true oder false sind aber keine basistypen, sondern nur werte von bool.

    int i = 1, da ist die 1 ja auch kein basistyp...



  • Ich weiß, dass false und true Schlüsselwörter von C++ sind. Die Frage ist, ob man diese beiden zu den Basisdatentypen zählen darf. Eigentlich sind es ja keine Datentypen im eigentlichen Sinne, sondern nur die zwei möglichen Werte des Datentyps bool (bzw. eigentlich auch von char, short, int und long, da gibt es nur mehr als die zwei Werte).

    @RPD: ich hatte deinen Post noch nicht gelesen. 😉



  • dacht ich mir 🙂

    ot: was ich grad noch gelesen hab...

    bool b;
    b++; // oder ++b ist erlaubt -> macht b true
    b--; // oder --b ist nicht erlaubt
    


  • true i;

    funktioniert nicht.
    true ist also kein typ

    true ist wie 1 ein einfacher wert



  • 'c' ist default-mäßig char. 4 ist default-mäßig int. true ist default-mäßig bool. beantwortet das deine frage?



  • Man findet in manchen Büchern alles auf einem Haufen unter dem Begriff Basisdatentyp:

    false  true 
    bool
    char    wchar_t
    short   int   long  
    signed  unsigned
    float   double
    void
    

    false und true passen da nicht rein, sind einfach 0 und 1.

    void-Variablen kann man aber auch nicht erstellen. void ist nur als Argument oder Rückgabewert erlaubt oder als Zeigertyp void*, void** usw., offenbar dennoch Basisdatentyp, d.h. mit

    typ a = ...;

    kann man das nicht sicher checken.

    signed und unsigned sind Basisdatentypen, da sie durch int ergänzt werden.



  • @RPD:

    #include <iostream>
    using namespace std;
    int main()
    {
      bool b = false;
      b++; // erlaubt
      cout << b;  // 1
      b++; // erlaubt
      cout << b;  // 1
      // b--; // nicht erlaubt
      cout << b;
    
      bool c = true;
      // c--; // nicht erlaubt
      cout << c;
    
      cin.get();   
      return 0;
    }
    

    Das wusste ich bisher nicht. 😕



  • @EH
    meines wissens nach ist
    false == 0
    und
    true != false
    also nicht ausschließlich 1 sondern eben irgendwas außer != 0



  • #include <iostream>
    using namespace std;
    
    int main()
    {
      int zahl = true;
      cout << zahl; // 1
    
      cin.get();   
      return 0;
    }
    

    true == 1 (alles andere ist akademisch 😃 )



  • meines wissens nach ist
    false == 0
    und
    true != false
    also nicht ausschließlich 1 sondern eben irgendwas außer != 0

    Kommt immer drauf an in welchem Kontext man bool Werte betrachtet.
    laut Standard:
    für Zuweisung

    An rvalue of type bool can be converted to an rvalue of type int, with false becoming zero and true becoming one.

    für Auswertung

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



  • #include <iostream> 
    using namespace std; 
    int main() 
    { 
      bool b;
      cout<<++b; //bei mir ist b auch 1
      return 0; 
    }
    

    das gefällt mir irgendwie...wer braucht schon true oder false 😃



  • true can in 1 gecastet werden, ist deswegen aber noch lange nicht 1. true ist true; ein eigenständiger Literal.

    class Foo {
    public:
       operator int()
       {
          return what_m == "Cat";
       }
       Foo (const std::string & what)
       { 
          what_m = what;
       }
       ...
    privat:
       std::string what_m;
    };
    
    Foo bar("Cat");
    Foo quer("Dog");
    
    cout << static_cast<int>(bar) << '\n';
    cout << static_cast<int>(quer) << '\n';
    

    Ist Foo("Cat") deswegen jetzt 1?



  • versteh nicht was du damit sagen willst? ich seh da kein bool, kein false und kein true?

    The bool type participates in integral promotions. An r-value of type bool can be converted to an r-value of type int, with false becoming zero and true becoming one.

    so einfach ist das...



  • Hallo,
    nur noch als Ergänzung: Präfix- und Postfix-Increment ist laut Standard deprecated für bool.



  • @HumeSikkins: der Zusammenhang zwischen bool und int ist klar, aber warum geht bei bool ++ und -- nicht (veraltet oder nicht spielt jetzt erst mal keine Rolle; was geht, geht. 🙂 )? Entweder man verbietet beides oder erlaubt beides, ich verstehe den Unterschied noch nicht ganz.



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


Anmelden zum Antworten