True und False

Gast #2949685
Lesenswert?

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.
Gast #2949733
Lesenswert?

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.
Persönliche Seite #2949759
Lesenswert?

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
}
Gast #2949768
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren