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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.