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
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).
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
@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