2016-02-16 11 views
8

Ich habe den Standard gesucht, aber den erwähnten Teil nicht bemerkt.! 0 garantiert 1 in C89 zu sein?

Ist es nur „alles andere als 0“ und 1 oder es ist Compiler-abhängig?

+3

Integrierte Operatoren, die logisch Booleschen Ergebnisse liefern ('<', '>', '<=', '> =', '==', '! =', '&&', '||', '!') Ergeben immer genau '0' oder' 1' vom Typ 'int'. Bestimmte Bibliotheksfunktionen, wie 'isdigit()', geben "0" für false oder irgendeinen Wert ungleich null für true zurück. –

Antwort

23

Das Ergebnis des logischen Negationsoperators ! ist 0, wenn der Wert des Operanden auf 0, 1, wenn der Wert des Operanden das Ergebnis gleich 0 vergleicht Typen hat int ungleicher vergleicht.

Erscheint in C89/C90, C99 und C11.

+2

Können Sie den Link hinzufügen, wo Sie das gefunden haben? – AustinWBryan

+1

http://port70.net/~nsz/c/c89/c89-draft.html#3.3.3.3 –

+0

Vielen Dank! – susdu

4

Wie hobbs in seiner Antwort sagte section 6.5.3.3.5 of the C standard heißt es, dass !0-1 auswertet.

Zusätzlich kann dieses Verhalten verwendet werden, um eine ganze Zahl auf einen booleschen Wert (d. H. Entweder 0 oder 1) mit dem Ausdruck !!x zu normalisieren.

  • Wenn x = 0, !!x = !!0 = !1 = 0.
  • Wenn x! = 0, !x = 0, so !!x = !0 = 1.