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.
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 ....
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.
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()
{
}
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 )
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.
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.
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?
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.
gestattet ihr mir die Wogen zu glätten? Fühle mich irgendwie verantwortlich.
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?