Was ist !0 in C?

Lesezeit: 4 Minuten

Ich weiß das in C, denn wenn Aussagen und Vergleiche FALSE = 0 sind und alles andere gleich wahr ist.

Somit,

int j = 40
int k = !j

k == 0 // this is true

Meine Frage behandelt das Gegenteil. Was wird aus !0? 1?

int l = 0
int m = !l

m == ? // what is m?

  • @Josh K: Perfekter Rat. Ich wünschte, jeder würde es zuerst versuchen und dann nach den Ergebnissen fragen eigentlich habe.

    – S. Lott

    7. September 2010 um 19:01 Uhr

  • @Josh K: Da es durchaus je nach Compiler / Standard / Wochentag variieren kann (wenn es beispielsweise kein definiertes Verhalten ist, obwohl dies in diesem Fall offensichtlich der Fall ist), spiegelt das Anzeigen eines einzelnen Ergebniswerts möglicherweise nicht genau wider, was es wird auf einem anderen gegebenen Setup sein.

    – Steven Schlansker

    7. September 2010 um 19:02 Uhr


  • Mit meiner aktuellen Ausrüstung nicht möglich. Ich habe Probleme, meinen C-Compiler zum Laufen zu bringen – was eine eigene Frage ist, nehme ich an. 😛

    – Rabenträumer

    7. September 2010 um 19:02 Uhr

  • @S.Lott: Hier gibt es keine “Meinungen”. Das Verhalten ist im Standard klar formuliert.

    – Stefan Kanon

    7. September 2010 um 19:29 Uhr

  • Dieses Verhalten der ! Operator wurde in K&R Erstausgabe in Abschnitt 2.6 auf Seite 38 erwähnt: „Der unäre Negationsoperator ! wandelt einen Nicht-Null- oder True-Operanden in 0 und einen Null- oder False-Operanden in 1 um.”

    – RBerteig

    7. September 2010 um 22:19 Uhr

Benutzer-Avatar
jamesdlin

Boolesche/logische Operatoren in C müssen entweder 0 oder 1 ergeben.

Aus Abschnitt 6.5.3.3/5 des ISO C99-Standards:

Das Ergebnis des logischen Negationsoperators ! ist 0, wenn der Wert seines Operanden ungleich 0 ist, 1, wenn der Wert seines Operanden gleich 0 ist.

In der Tat, !!x ist eine gebräuchliche Redewendung, um einen Wert entweder auf 0 oder 1 zu zwingen (ich persönlich bevorzuge x != 0obwohl).

Siehe auch Q9.2 aus der comp.lang.c-FAQ.

  • Guter Anruf. Sieht so aus, als müssten mehr von uns den verdammten ISO-Standard lesen.

    – Justin Nießner

    7. September 2010 um 19:15 Uhr

  • +1 für den Hinweis auf den Standard, aber Code, der verwendet wird !! muss direkt zum Mülleimer.

    – Billy ONeal

    7. September 2010 um 19:17 Uhr

  • @mathepic: Ja, das gilt auch für C89 (Abschnitt 6.3.3.3).

    – jamesdlin

    7. September 2010 um 19:38 Uhr

  • @Billy ONeal: Meiner Meinung nach “flagvar = !!(multibitFlag & BIT_OF_INTEREST);” ist klarer als “flagvar = ((multibitFlag & BIT_OF_INTEREST) ​​!= 0);” Was wird durch die zusätzliche Ausführlichkeit des letzteren Formats gewonnen?

    – Superkatze

    7. September 2010 um 20:02 Uhr

  • @caf und @supercat: Unerfahrene C-Programmierer denken manchmal !! ist ein distinkter Operator (wie && oder ||) und verwirrt werden. Ich denke, doppelte Verneinungen sind im Allgemeinen schwerer zu verstehen, und zwar != erfordert auch, dass die Leute verstehen, dass es entweder 0 oder 1 produziert, es scheint einfacher zu sein, da es nur eine Operation und nicht zwei ist.

    – jamesdlin

    8. September 2010 um 17:12 Uhr

§6.5.3.3/5: „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 den Typ int.“

Die anderen logischen Operatoren (zB &&, ||) immer auch entweder 0 oder 1 erzeugen.

Im Allgemeinen, ja, es wird 1. Das heißt, selbst wenn dies ein garantiertes Verhalten ist (wobei ich mir nicht sicher bin), würde ich Code, der sich darauf stützte, als ziemlich schrecklich betrachten.

Sie können davon ausgehen, dass es sich um einen wahren Wert handelt. Mehr würde ich nicht vermuten.

  • Nicht nur allgemein; stets. Boolesche Operatoren in C müssen entweder 0 oder 1 zurückgeben.

    – jamesdlin

    7. September 2010 um 19:05 Uhr


  • Dennoch fühlt es sich wie ein Verstoß gegen die Absicht an, dass Ihr Code Absicht zeigt.

    – Steven Schlansker

    7. September 2010 um 19:27 Uhr

  • Gar nicht. Dinge wie prefix="-"+!neg; vollkommen gesund sind C.

    – R.. GitHub HÖR AUF, EIS ZU HELFEN

    7. September 2010 um 19:56 Uhr

  • @R..: Das hatte ich noch nie gesehen. Wenn neg falsch ist, zeigt es auf das Nullbyte am Ende der Zeichenfolge? Süßer, als das Präfix ein Zeichen zu haben, das entweder 45 oder 0 ist, und die Anzeigeroutine Nullbytes herausfiltern zu lassen).

    – Superkatze

    8. September 2010 um 14:52 Uhr

  • Ja, wenn neg ist dann falsch prefix zeigt auf einen leeren String. Wenn es wahr ist, prefix zeigt auf die Saite "-" (natürlich mit Nullterminierung in beide Richtungen).

    – R.. GitHub HÖR AUF, EIS ZU HELFEN

    8. September 2010 um 16:18 Uhr

Der Bang-Operator (!) ist der logische Not-Operator, der häufig in C, C++ und C# vorkommt

!0 == 1
!1 == 0

Dies basiert auf der Sprachcharakteristik dessen, was entweder als wahr oder falsch interpretiert wird … in moderneren Sprachen wäre es so

!false == true
!true == false

Sehen DeMorgan Gesetz über Wahrheitstafeln…

!x wird erweitert (x==0) Also:

  • wenn x=0 -> !x Wert nehmen von (0==0) = TRUE (Wert 1)
  • wenn x!=0 -> !x Wert nehmen von (x==0) = FALSCH (Wert 0)

1175970cookie-checkWas ist !0 in C?

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

Privacy policy