In der C-Sprache, was bedeutet die Rückkehr "~0" bedeuten?
Bin ich den Umgang mit einigen C-code enthält
return ~0;
Was bedeutet das? Es ist ziemlich unmöglich, google für...
- Google nach "c-Operatoren" und du wirst es finden.
- jemand wird klug. Es ist das gleiche wie -1.
- In Fällen wie diesen, müssen Sie denken von alternativen Abfragen, wie "C-Operatoren" oder "C-tilde-operator"
- Whitlock: ... auf ein Zweierkomplement-Maschine. Es ist negativ null (
-0
) auf einer einer-Komplement-Maschine, und es istINT_MIN
auf ein signed-magnitude-Maschine. - Es ist schon komisch, wie das Wort "clever" in der Programmierung bedeutet meist "dumm". Ich würde die Sache nicht ein konstanter Ausdruck, der bedeutet, verschiedene Dinge auf verschiedenen CPU-Architekturen als "clever" an alle.
- Ich denke, eine solche Qualifikation ist ein bisschen unhöflich und nicht an Ihrer Stelle auf SO. Kann jemand unwissend sein an bestimmten Orten, ohne und
idiot
. - Nach dem lernen, was Sie tut und Sie durch den code, dessen Verwendung durchaus Sinn macht. In seinem speziellen Fall war es beschränkt auf die Rückgabe eines unsigned int, und auch unsicher ist, der Bogen. Rückkehr ~0 ist, wie nah an der Rückkehr -1 als Autor bekommen konnte
- Was ist der Zweck, dies zu tun ? Welchen Effekt hat es ? Ich habe gesehen, diesen code in Git-Quellcode zu
- osager: es wird sichergestellt, dass jedes bit der zurückgegebene Wert eine 1, unabhängig von der arch/Typ. Dies kann wichtig sein, wenn Sie Dinge, die Sie mit Bitmasken oder sind in der Regel tun eine Menge von bit-level-Operationen
- Das zusätzliche Gewicht gegenüber dem argument, dass "es gibt gute Anwendungsfälle für
~0
": Linie 67 von OS Xusr/include/dispatch/once.h
:if (DISPATCH_EXPECT(*predicate, ~0l) != ~0l) {
.
Du musst angemeldet sein, um einen Kommentar abzugeben.
~ ist ein Bitweises nicht/ergänzen, aka es ändert alle 0 auf 1 und Umgekehrt. ~0 ist ein Wert, mit dem alle bits auf 1 gesetzt.
Den Schlüssel zur Beantwortung dieser Klasse in Frage, weil Sie besichtigen den code zu erkennen, reicht es, die Struktur der Sprache zu wissen, welche Frage zu stellen. Zum Beispiel, die
return
- Anweisung erfordert ein Ausdruck, der eine Typ kompatibel mit dem deklarierten Rückgabetyp für die Funktion selbst.Wissen, dass
~0
muss ein Ausdruck, es ist entweder eine wirklich lustige Art zu schreiben, eine Zahl, oder es ist ein operator, den Sie nicht erkennen, angewendet auf die Konstante null. Dass letztere Hypothese ist leicht zu überprüfen und googeln für "C-Sprache-operator" wird rasch zu Dutzende von Tische von Operatoren. Fast jeder man wird Ihnen sagen, dass die~
operator ist eine bitweise-nicht unärer operator, die invertiert jedes einzelne bit seines Operanden. In diesem Fall konvertiert die Ganzzahl0
für das dargestellte ganze Zahl mit allen bits gesetzt.Auf den meisten Plattformen, die Sie stoßen werden, die ganze Zahl hat den Wert -1.
Den
~
(tilde) - operator führt eine bitweise Komplement auf der single-integer-Operanden.Ergänzung einer Zahl bedeutet, alles zu verändern, was die
0
bits zu1
und alle1
s zu0
s~
ist das bitweise NICHT, wie @user446034 zeigte in seiner Antwort. Diejenigen, die' Ergänzung ist ein Schema für die Darstellung von zahlen im Binär-format, verwendet diesen operator.Sowieso, für Suchanfragen, die mit speziellen Symbolen, wie Ihre "Rückkehr ~0;", die Sie verwenden können
http://symbolhound.com/
Es ist ziemlich nützlich für Programmierer.
Gibt es zwei unabhängige Teile hier:
return
und~0
.return
ist eine return-Anweisung. Lesen Sie über es in Ihrem Lieblings-C-Buch.~0
ist ein Ausdruck, bestehend aus Bitweises Komplement-operator~
angewendet integer-Konstante0
. Alle bits, die in einen null-Wert des Typsint
invertiert sind (1) und der daraus resultierendenint
Wert (alle bits auf 1 gesetzt) ist, was~0
Ausdruck. Auf einer Zweierkomplement-Maschine einer signierten ganzzahligen Wert mit einem solchen bit-Muster (111...1
) darstellen würde-1
.Nicht null oder Wahr.
!0
könnte Sinn machen, aber~0
ist Unsinn (und, wie andere gesagt haben, ist durch die Implementierung festgelegt, so ist es sollte nie verwendet werden, außer in hardware-spezifische bit-twiddling-code).~0
unterscheidet, dass es bedeutet, mehr als nur "nicht null" (also tut-1
). Ich denke, die Aussage "Nicht null oder true" ist weniger richtig, als alternative Definitionen.Die tilde bedeutet eine bitweise Kompliment an die Nummer 0, das gibt wieder einen Wert mit allen bits auf 1 gesetzt sind, mit dem, was die Größe der Rückgabewert (so dass Sie bekommen würde, 0xFF für einen char, etc).
~x
wox
Typchar
, erhalten Sie die gleiche Sache wie~(int)x
aufgrund der Standard-promotions, nicht0xff
.