Ist das “wahre” Ergebnis von >,

Lesezeit: 3 Minuten

Benutzer-Avatar
mbq

Wenn ich zum Beispiel schreibe 7>1 Kann ich in C (z. B. C99, wenn dies nicht immer eine Funktion ist) erwarten, dass das Ergebnis genau 1 oder nur ein Wert ungleich Null ist? Gilt dies für alle boolschen Operatoren?

  • Es ist höchstwahrscheinlich ein Duplikat, aber ich konnte es nicht finden 🙁

    – mbq

    7. Oktober 2011 um 12:42 Uhr

  • @TRD: Falsch. Der C-Ausdruck 7>1 liefert ein Ergebnis vom Typ int mit dem Wert 1.

    – Keith Thompson

    4. Februar 2012 um 21:39 Uhr

Benutzer-Avatar
Matte

In C99 §6.5.8 Vergleichsoperatoren, Punkt 6 (<,>,<= und >=):

Jeder der Operatoren < (kleiner als), > (größer als), <= (kleiner als oder gleich) und >= (größer als oder gleich) muss ergeben 1 wenn die angegebene Beziehung wahr ist und 0 wenn es falsch ist) Das Ergebnis hat einen Typ int.

Bei Gleichheitsoperatoren geht es in §6.5.9 etwas weiter (== und !=):

Die Operatoren == (gleich) und != (ungleich) sind analog zu den relationalen Operatoren, abgesehen von ihrer niedrigeren Priorität. Jeder der Operatoren ergibt 1 wenn die angegebene Beziehung wahr ist und 0 wenn es falsch ist. Das Ergebnis hat Typ int. Für jedes Paar von Operanden ist genau eine der Relationen wahr.

Das logische UND und das logische ODER sind noch etwas weiter in §6.5.13 (&&)

Der Operator && soll nachgeben 1 wenn beide Operanden ungleich 0 sind; andernfalls gibt es nach 0. Das Ergebnis hat Typ int.

… und §6.5.14 (||)

Die || Betreiber soll nachgeben 1 wenn einer seiner Operanden ungleich 0 ist; andernfalls gibt es nach 0. Das Ergebnis hat Typ int.

Und die Semantik des unären arithmetischen Operators ! sind bei §6.5.3.3/4 vorbei:

Das Ergebnis des logischen Negationsoperators ! ist 0 wenn der Wert seines Operanden ungleich 0 ist, 1 wenn der Wert seines Operanden gleich 0 ist. Das Ergebnis hat einen Typ int. Der Ausdruck !E entspricht (0==E).

Ergebnistyp ist int auf ganzer Linie, mit 0 und 1 als mögliche Werte. (Es sei denn, ich habe etwas übersehen.)

  • Und praktischerweise definiert stdbool.h true und false als 1 und 0 (C99 7.16).

    – Ludin

    7. Oktober 2011 um 13:20 Uhr


  • Gut, besonders da && und || verhalten sich in anderen Sprachen anders (Rückgabe des zuletzt ausgewerteten Werts). Wenn die Standardoperatoren nicht involviert sind, kann das Spannen mit erfolgen !! oder Gießen zu <stdbool.h> bool.

    – Tobus

    5. Januar 2014 um 8:34 Uhr

C folgt Postels Gesetz für seine booleschen Operatoren: sei konservativ in dem, was du tust, sei liberal in dem, was du von anderen akzeptierst. Es wird jeden Wert ungleich Null in booleschen Ausdrücken als wahr behandeln, aber es wird selbst immer entweder eine 0 oder eine 1 erzeugen. 2 != 3 ist immer 1.

Benutzer-Avatar
thkala

Aus dem ISO C99-Standard, Abschnitt 6.5.8:

6 Jeder der Operatoren < (kleiner als), > (größer als), <= (kleiner oder gleich) und >= (größer als oder gleich) muss 1 ergeben, wenn die angegebene Beziehung wahr ist, und 0, wenn sie wahr ist ist falsch. Das Ergebnis hat den Typ int.

Ab Abschnitt 6.5.9:

3 Die Operatoren == (gleich) und != (ungleich) sind analog zu den Vergleichsoperatoren, abgesehen von ihrer niedrigeren Priorität. Jeder der Operatoren ergibt 1, wenn die angegebene Beziehung wahr ist, und 0, wenn sie falsch ist. Das Ergebnis hat den Typ int. Für jedes Paar von Operanden ist genau eine der Relationen wahr.

Dasselbe passiert mit der logischen Konjunktion (&&) und Disjunktion (||) Operatoren.

PS: Aus diesem Grund sind übrigens die bitweisen Operatoren (& und |) können normalerweise als nicht kurzschließende Versionen der logischen Operatoren verwendet werden.

Alle C Betreiber die logisch wahre/falsche Werte liefern, ergeben immer ein Ergebnis vom Typ int mit dem Wert 0 für falsch, 1 für wahr.

Das gilt nicht für alle C Ausdrücke die logisch wahre/falsche Werte ergeben. Zum Beispiel die is*() Zeichenklassifizierungsfunktionen deklariert in <ctype.h> (isdigit(), isupper()usw.) zurück 0 wenn die Bedingung falsch ist, kann aber jeden Wert ungleich Null zurückgeben, wenn die Bedingung wahr ist.

Solange Sie das Ergebnis direkt als Bedingung verwenden:

if (isdigit(c)) ...
if (!isdigit(c)) ...
if (isdigit(c) || islower(c)) ...

und nicht versuche es mal mit etwas zu vergleichen:

if (isdigit(c) == 1) ...    /* WRONG */
if (isdigit(c) == true) ... /* ALSO WRONG */

das sollte keine probleme machen.

(Du kann Vergleichen Sie das Ergebnis sicher mit 0 oder false, aber es gibt keinen guten Grund dafür; das ist, was die ! Betreiber ist für.)

1225130cookie-checkIst das “wahre” Ergebnis von >,

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy