Wie ist bool im Detail definiert?

Hallo,

sicherlich eine blöde Frage aber ich muss das fragen, weil ich ein Problem bei einem Interrupt Code habe.

Meine Frage ist funktioniert bool nur mit dem letzten Bit 2^0 ?
Oder ist bool == true auch wahr wenn Bit 2^3 = 1 gesetzt ist?

Anders formuliert.

Wenn var = 7 und var Typ bool, kann ich da sicher gehen das ich den Wert 7 in eine bool Variable schreiben kann?
Um diese dann woanders mit if (var) abfragen. Oder muss das dann byte sein?

Ich benötige den Bsp.wert 7 bei der Abfrage nicht. Ich bekomme den aus einem Register zurück und ich will nur wissen ob der 0 ist oder nicht. Der Typ bool wäre im Sketch besser lesbar was das darstellt statt byte.

bool kann nur 0 oder 1 sein. Wenn du etwas anderes zuweist wird es 1

Das kann man doch ganz einfach testen:

bool var = 7;

void setup() 
{ 
  Serial.begin(9600);

  if (var)
    Serial.println("wahr");
  else
    Serial.println("falsch");

  if (var == true)
    Serial.println("wahr");
  else
    Serial.println("falsch");
}

void loop()
{ 
}

Da einen Integer zu nehmen ist ganz gefährlich. Das Arduino Team hatte anfangs mal diesen Unsinn gemacht und boolean als unsigned char definiert:

byte var = 7;

void setup() 
{ 
  Serial.begin(9600);

  if (var)
    Serial.println("wahr");
  else
    Serial.println("falsch");

  if (var == true)
    Serial.println("wahr");
  else
    Serial.println("falsch");
}

void loop()
{ 
}

In C hat man da früher oft !!var geschrieben um durch die doppelte Negation Werte auf 0 oder 1 zu normalisieren

Wie ist bool im Detail definiert?

stdbool.h (liegt dem Compiler bei)

#define bool _Bool

Und _Bool ist ein, dem Compiler innewohnender, nativer Datentype.
Also alle weitere Definitionen im Quellcode des Compilers.

Hallo,

ich Danke Euch. Ich suche schon länger einen Fehler und musste einfach zwischendurch mal Jemanden fragen.
Manchmal verrennt man sich (ich) ja irgendwie.
Dann mache ich mal weiter ....

Hallo,

da man bool nicht inkrementieren kann, habe ich den Testcode angepasst.
Ich finde das Ergebnis durchaus interessant für alle die das Verhalten noch nicht kannten bzw. vergessen hatten. :wink:
Obwohl ich mich dunkel erinnere das die richtige bzw. sicherere byte auf if Abfrage ohne == true schon einmal Thema war.

i= 0    if (i) falsch    if (i == true) falsch
b= 0    if (b) falsch    if (b == true) falsch

i= 1    if (i) wahr      if (i == true) wahr
b= 1    if (b) wahr      if (b == true) wahr

i= 2    if (i) wahr      if (i == true) falsch
b= 1    if (b) wahr      if (b == true) wahr

i= 3    if (i) wahr      if (i == true) falsch
b= 1    if (b) wahr      if (b == true) wahr

i= 4    if (i) wahr      if (i == true) falsch
b= 1    if (b) wahr      if (b == true) wahr

i= 5    if (i) wahr      if (i == true) falsch
b= 1    if (b) wahr      if (b == true) wahr

i= 6    if (i) wahr      if (i == true) falsch
b= 1    if (b) wahr      if (b == true) wahr

i= 7    if (i) wahr      if (i == true) falsch
b= 1    if (b) wahr      if (b == true) wahr

i= 8    if (i) wahr      if (i == true) falsch
b= 1    if (b) wahr      if (b == true) wahr

Code:

void setup()
{
  Serial.begin(9600);


  for (byte i = 0; i < 9; i++)
  {
    Serial.print("i= ");
    Serial.print(i);
    Serial.print('\t');
    Serial.print("if (i) ");

    if (i)
      Serial.print("wahr  ");
    else
      Serial.print("falsch");

    Serial.print('\t');
    Serial.print("if (i == true) ");

    if (i == true)
      Serial.print("wahr");
    else
      Serial.print("falsch");

    Serial.println();

    bool b = i;             // bool inkrementieren nicht möglich

    Serial.print("b= ");
    Serial.print(b);
    Serial.print('\t');
    Serial.print("if (b) ");

    if (b)
      Serial.print("wahr  ");
    else
      Serial.print("falsch");

    Serial.print('\t');
    Serial.print("if (b == true) ");

    if (b == true)
      Serial.print("wahr");
    else
      Serial.print("falsch");

    Serial.println();
    Serial.println();
  }

}

void loop()
{
}

Doc_Arduino:
Obwohl ich mich dunkel erinnere das die richtige bzw. sicherere byte auf if Abfrage ohne == true schon einmal Thema war.

Ja, war es, nämlich zumindest hier (war "mein" Topic): Verwirrung: nur 1 ist true
Und es steht geschrieben in:

E:\Programme\arduino\hardware\tools\avr\lib\gcc\avr\5.4.0\include\stdbool.h
#define true 1

Das habe ich mir gemerkt :slight_smile:

Ds ist wirklich ein Problem für viele im Verständnis.

i=7;
if (i) heißt: i == 0 --> false, ansonsten true. Das ist die C/C++-Regel

true ist aber wohl auf 1 spezifiziert, wie der Rest zeigt:

i=7
if (i==true) --> false

Das ist eigentlich inkonsistent.

Gruß Tommy

Edit: Uxomm war schneller :wink:

bool b = i;   // bool inkrementieren nicht möglich

Ich sehe es eher so, dass die Zuweisung an eine bool Variable aus jedem Wert ungleich 0 true macht, und dass print true als 1 darstellt. Oder true bei der Umwandlung in eine Zahl als 1 behandelt. Oder true beim Speichern in einem Byte als 1 ablegt.

Nachtrag:
if ( a == b ) hängt von den Datentypen von a und b ab. Und da sind 2 und true nunmal nicht gleich.
if ( c ) wandelt bei Bedarf c in einen bool Wert um.

Eigentlich ziemlich konsistent. bool ist ein anderer Datentyp als byte.

nochmal ein Erklärungsversuch, warum
if (i==true) --> false
sehr wohl "konsistent" ist:

true und false sind keine Zahlen, sondern "boolean literals"
Um sie wie Zahlenwerte mit mathematischen Operatoren verknüpfen zu können (gleich, ungleich, und, oder, nicht, Zuweisung,...) müssen true und false als Zahlen ausgewertet, d.h. auf Zahlen abgebildet (gecastet) werden.
die Auswertungsfunktion (Abbildung) true -> 1
(von der Menge {false; true} auf die Untermenge {0; 1} der Ganzen Zahlen )
ist dabei nicht bijektiv für alle beliebigen Ganzen Zahlen, man darf sie also grundsätzlich nicht umkehren für Zahlen ungleich 0 oder 1.

true wird demnach zu 1 ausgewertet (auf 1 abgebildet);
aber jedes beliebige int, das nicht falsch ist (d. h. ungleich 0 ist), wird zu true ausgewertet (auf true abgebildet): damit ist es jedoch nicht gleich true, da es nicht gleich 1 ist.

will man also ein beliebiges
int i;
auswerten per
if(i==true)
muss man explizites type casting vornehmen:
if( bool(i)==true )

Hallo,

damit wäre ja alles geklärt. :wink:
Danke nochmal @ all.

will man also ein beliebiges
int i;
auswerten per
if(i==true)
muss man explizites type casting vornehmen:
if( bool(i)==true )

Neee... neee.... neee ....

Man lässt einfach den Vergleich weg!

if(i)
Und fertig ist die Laube.

Ein Vergleich auf false ist übrigens genauso Sinn befreit!

if(not i)


Merksatz:

Überflüssiger Kram ist eine völlig überflüssige Fehlerquelle.

Also weiterhin die alte C-Regel: Alles, was nicht numerisch 0 oder nullptr ist, ist true. Passt.

Gruß Tommy

combie:
Neee... neee.... neee ....

Man lässt einfach den Vergleich weg!

if(i)
Und fertig ist die Laube.

Ein Vergleich auf false ist übrigens genauso Sinn befreit!

if(not i)


Merksatz:
Überflüssiger Kram ist eine völlig überflüssige Fehlerquelle.

du hast den Punkt nicht verstanden, um des es ging.
Es ging um das Problem, wieso z.B.
if(2==true) // zu -> false
ausgewertet wird.

den Grund dafür habe ich erklärt, und auch wie man es machen müsste, damit man dennoch ein integer auf Gleichheit zu true oder false testen könnte,
nämlich per explizitem type casting:
if(bool(2)==true) // -> true
Denn jetzt werden korrekterweise zwei Boolean Typen miteinander verglichen - und nicht mehr wie vorher fälschlich ein Integer mit einem Boolean Typ.

Das ist nun genauso richtig oder falsch wie
if(2) // -> true
und sollte ntl nicht so missinterpretiert werden, dass if(bool(2)==true) besserer Stil wäre als if(2) .

Dennoch, vom Standpunkt der C-Syntax und der C-Typ- und Sprach-Definitionen ist beides in gleicher Weise korrekt.

dsyleixa:
du hast den Punkt nicht verstanden, um des es ging.
.....

Dennoch, vom Standpunkt der C-Syntax und der C-Typ-Definitionen ist beides in gleicher Weise korrekt.

Wie kommst du auf die Idee, mir erzählen zu wollen, was ich "nicht verstanden" habe?

Hier mal zum mit meißeln .....!

Frei nach "Ockhams Rasiermesser":

Wenn 2 Verfahren das gleiche Ergebnis bringen,
dann ist das einfachere, das Korrekte!

Und somit ist aus meiner Sicht if(bool(2)==true) definitiv ein Fehler.
Sowas sollte nicht in einem Forum, wo Anfänger ihre Kreise ziehen, empfohlen werden.
(es sei denn man möchte sie dumm halten, oder ins Messer laufen lassen)

Zumindest wird der Autor, hier du, die Kritik dann einstecken müssen.

Merksatz:

Irren ist menschlich.
Im Irrtum verharren ist Dummheit.

combie:
Wie kommst du auf die Idee, mir erzählen zu wollen, was ich "nicht verstanden" habe?

Hier mal zum mit meißeln .....!

Frei nach "Ockhams Rasiermesser":

Wenn 2 Verfahren das gleiche Ergebnis bringen,
dann ist das einfachere, das Korrekte!

Und somit ist aus meiner Sicht if(bool(2)==true) definitiv ein Fehler.
Sowas sollte nicht in einem Forum, wo Anfänger ihre Kreise ziehen, empfohlen werden.
(es sei denn man möchte sie dumm halten, oder ins Messer laufen lassen)

Zumindest wird der Autor, hier du, die Kritik dann einstecken müssen.

Merksatz:

Irren ist menschlich.
Im Irrtum verharren ist Dummheit.

naja gut - wenn du es nicht einsehen willst, dass es korrekt ist (es wird ja u.a. auch auf stackoverflow so beschrieben) und du weiter auf deiner falschen Äußerung beharrst und wieder nur hochnäsige Sprüche und Allgemeinplätze von dir gibst -
ich glaub's dann für dich mit, dass es korrekt ist. :wink:

dsyleixa:
naja gut - wenn du es nicht einsehen willst, dass es korrekt ist (es wird ja u.a. auch auf stackoverflow so beschrieben) und du weiter auf deiner falschen Äußerung beharrst und wieder nur hochnäsige Sprüche und Allgemeinplätze von dir gibst -
ich glaub's dann für dich mit, dass es korrekt ist. :wink:

Cool, dann eben der Schwanzvergleich !?

Vor wie viel Jahren hast du dein erstes Programm mit if geschrieben?
Wie lange hast du dich bisher von deinen Programmierkünsten ernährt?
In wie vielen Programmierer Teams dürftest du schon arbeiten?

combie:
Cool, dann eben der Schwanzvergleich !?

Vor wie viel Jahren hast du dein erstes Programm mit if geschrieben?
Wie lange hast du dich bisher von deinen Programmierkünsten ernährt?
In wie vielen Programmierer Teams dürftest du schon arbeiten?

na komm, bleib sachlich.
Keine Ahnung, wie viele Jahre du schon irgendwelche C-Dinge als falsch oder Fehler bezeichnest, obwohl sie faktisch richtig sind.
Aber auf deine Besserwisserei und dein Diskkussionsniveau lasse ich mich nicht ein, und tatsächlich bist du ja hier definitiv im Unrecht.
Aber glaub was du willst, ich wollte nicht dich bekehren sondern dem OP den Grund erklären.

sondern dem OP den Grund erklären.

Die Konsequenz hat unser Doc_Arduino schon in Posting #4 mit "if Abfrage ohne == true" schon völlig korrekt erkannt.

und tatsächlich bist du ja hier definitiv im Unrecht.

Womit?

Hallo,

gestattet ihr mir die Wogen zu glätten? Fühle mich irgendwie verantwortlich. :slight_smile:
Hier haben verschiedenste Leute verschiedene Möglichkeiten erklärt wie man auf true abfragen kann.
dsyleixa hat zum Schluss nur noch die ausführlichste Variante gezeigt die es wohl überhaupt gibt.
Gleichzeitig weiß dsyleixa (da bin ich mir mittlerweile sicher) das dieser Syntax kompliziert ist und
gibt combie auch recht dass der Syntax if (var) der einfachste und sicherste ist.
Frieden? Alle glücklich?

combie:

sondern dem OP den Grund erklären.

Die Konsequenz hat unser Doc_Arduino schon in Posting #4 mit "if Abfrage ohne == true" schon völlig korrekt erkannt.

und tatsächlich bist du ja hier definitiv im Unrecht.

Womit?

wurde alles schon gesagt, lies einfach nochmal nach und versuche daraus klüger zu werden