Hi, welchen dezimalen Wert hat ein TRUE oder FALSE wenn ich boolean nehme?
In C gibt es weder TRUE noch FALSE, und auch kein True und auch kein False. Per stdbool.h gibt es true und false, und die sind i.d.R !0 bzw. 0.
0 gilt als logisch falsch Alles ungleich 0 gilt als logisch wahr !0 ist laut Standard 1 C99-Standard schrieb unter 6.5.3.3 Unary arithmetic operators > The result of the logical negation operator ! is 0 if the value of its > operand compares unequal to 0, 1 if the value of its operand compares > equal to 0. The result has type int.
DirkB schrieb: > 0 gilt als logisch falsch > > Alles ungleich 0 gilt als logisch wahr > > !0 ist laut Standard 1 Ja, aber das heißt nicht, dass true = 1 sein muss!
PWM schrieb: >>!0 ist laut Standard 1 > Hab aber auch schon Compiler gesehen, die 255 lieferten. Das waren dann eben keine C-Compiler.
Da hier nicht nur die User sondern auch die Programmiersprachen sich nicht einig sind, halte Dich an die Fakten: In C gibt es kein True. Es gibt Ausdrücke, die wahr oder falsch sind, aber es ist niht einheitlich definiert, welcher numerische Wert (oder Werte) wahr sind. Auf jeden Fall ist falsch immer 0, da sind sich die Compiler wenigstens einig. Benutze einfach keine Konstanten für wahr und falsch, dann bist DU auf der sicheren Seite.
Ich habe es schon oft so gesehen: #define FALSE 0 #define TRUE !FALSE ...pastt dann zu 1 und 255.
Stefan schrieb: > In C gibt es kein True. Es gibt Ausdrücke, die wahr oder falsch sind, > aber es ist niht einheitlich definiert, welcher numerische Wert (oder > Werte) wahr sind. In C (und C++) sind alle Werte != 0 waht, d.h. in
1 | if (x) |
2 | { |
3 | <Code> |
4 | } |
Wird <Code> genau dann ausgeführt, wenn x nicht zu 0 auswertet. Daher sollte ein Vergleich zweier Werte, die "wahr" oder "falsch" sein können, so aussehen:
1 | if (!boolean1 == !boolean2) |
2 | { |
3 | <Code wenn beide boolean "wahr" oder beide "falsch" sind> |
4 | } |
Wenn der Compiler das Carry/Zero flag für True/False hernimmt, dann ist meistens nur diese Deklaration richtig: #define TRUE !(1==0) #define FALSE !TRUE Vielfach wird auch der Bool Operator (!!) hergenommen, um den Ausdruck zu optimieren, bei einer Zuweisung jedoch wird dann der Bool Datentyp richtig zugewisen. foo = !!bar ; ist dasselbe als foo = bar?1:0; Es gibt aber auch Compiler, welche -1 (255 im Falle von Char) verwenden. Dies ist darin begründet, dass zumindest in den Anfängen dieses Konstruct oft verwendet wurde, und dies geht nurmal bei -1, in vereinfachter Form: (foo==bar)&foobar wobei das (foo=bar) meist durch Preprozessorexpansion zustande kam. Einige Compiler unterstützen diese Art der Kodierung auch, obwohl sie ansonsten für Bool eine 0/1 ausgeben. Auch erleichtert dies diese Form des Konstructs: if (foo == bar && foobar) welche auch noch häufig anzutreffen ist. Wenn bool eine -1 ist, dann kann der Compiler die && mit einem & ersetzten, was einen Sprung weniger bedeutet, eine Cacheleerung weniger und weniger Ausführungszeit. Pauschal lässt sich das nicht sagen, da bool vielfach auf HW-Flags zurückgreift und einige Spezialfälle zu beachten sind.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.