Nach der Lektüre Hidden Features und dunkle Ecken C ++ / STL auf comp.lang.c++.moderated
, ich war völlig überrascht , dass die folgende Snippet erstellt und sowohl in Visual Studio 2008 und G ++ 4.4 gearbeitet.
Hier ist der Code:
#include <stdio.h>
int main()
{
int x = 10;
while (x --> 0) // x goes to 0
{
printf("%d ", x);
}
}
Ausgabe:
9 8 7 6 5 4 3 2 1 0
Ich würde annehmen, dass dies C ist, da es auch in GCC funktioniert. Wo ist dies in der Norm definiert und woher kommt es?
c++
c
operators
code-formatting
standards-compliance
GManNickG
quelle
quelle
++
oder--
vorher gesehen habe ...#define upto ++<
,#define downto -->
. Wenn Sie das Gefühl übel, können Sie tun ,#define for while(
und#define do ) {
(und#define done ;}
) und schreibenfor x downto 0 do printf("%d\n", x) done
Oh, die Menschheit ...Antworten:
-->
ist kein Operator. Es sind in der Tat zwei getrennte Operatoren,--
und>
.Der Code der Bedingung wird dekrementiert
x
, während derx
ursprüngliche (nicht dekrementierte) Wert zurückgegeben wird, und der ursprüngliche Wert wird dann mit der0
Verwendung des>
Operators verglichen .Zum besseren Verständnis könnte die Aussage wie folgt geschrieben werden:
quelle
while (x-- > 0)
zu tun hat . Es macht auch deutlicher, was vor sich geht (zumindest in einem Editor mit fester Schriftart), was bedeutet, dass die Klammern in dieser Antwort nicht erforderlich wären.Oder für etwas ganz anderes ...
x
rutscht zu0
.Nicht so mathematisch, aber ... jedes Bild sagt mehr als tausend Worte ...
quelle
why waste words when a picture does a better job
, die in diesem Zusammenhang als Witz verwendet wird. (Es gibt in der Tat 2 Schlüsselwörterwhile
undprintf
)Das ist ein sehr komplizierter Operator, daher hat sogar ISO / IEC JTC1 (Joint Technical Committee 1) seine Beschreibung in zwei verschiedenen Teilen des C ++ - Standards platziert.
Scherz beiseite, sie sind zwei verschiedene Operatoren:
--
und>
werden jeweils in §5.2.6 / 2 und §5.9 des C ++ 03-Standards beschrieben.quelle
Es ist gleichbedeutend mit
x--
(nach dem Dekrementieren) entsprichtx = x-1
dem folgenden Code:quelle
0 >-- x
In diesem Fallx
wird vor der Logik dekrementiert. In Postfix wird die Logik vor dem Dekrement ausgeführt und somit sind beide Abtastwerte äquivalent. Fühlen Sie sich frei, sie in a zu schreibenConsole
und zu testen.while(x=x-1,x+1 > 0)
ist gleichwertig.x
kann in der entgegengesetzten Richtung noch schneller auf Null gehen:8 6 4 2
Sie können die Geschwindigkeit mit einem Pfeil steuern!
90 80 70 60 50 40 30 20 10
;)
quelle
Es ist
Allein der Platz lässt die Dinge lustig aussehen,
--
dekrementiert und>
vergleicht.quelle
Die Verwendung von
-->
hat historische Relevanz. Das Inkrementieren war (und ist in einigen Fällen immer noch) schneller als das Inkrementieren in der x86-Architektur. Die Verwendung-->
schlägt vor, dass dies derx
Fall ist0
, und spricht diejenigen mit mathematischem Hintergrund an.quelle
So wird das analysiert.
quelle
Äußerster Geek, aber ich werde dies verwenden:
quelle
do ... while
eine Anweisungsliste ist. In C ist es ein Block, also muss es seindo { ... } while
.do statement while ( expression ) ;
. Trotzdem hoffe ich, dass ich das Beispiel als Witz verstanden habe.In einem Buch, das ich gelesen habe (ich erinnere mich nicht richtig, welches Buch), heißt es: Compiler versuchen, Ausdrücke mithilfe der Regel von links nach rechts auf das größte Token zu analysieren .
In diesem Fall lautet der Ausdruck:
Analysiert die größten Token:
Die gleiche Regel gilt für diesen Ausdruck:
Nach dem Parsen:
Ich hoffe das hilft den komplizierten Ausdruck zu verstehen ^^
quelle
a-----b
und denken(a--)-- - b
, was nicht kompiliert wird, weila--
es keinen l-Wert zurückgibt.x
und--
sind zwei separate Token.-->
es sich um einen Operator handelt (was durch die gestellte Frage impliziert wird), ist diese Antwort überhaupt nicht hilfreich - Sie werden denken, Token 2 ist es-->
nicht nur--
. Wenn Sie wissen, dass dies-->
kein Operator ist, haben Sie wahrscheinlich kein Problem damit, den Code in der Frage zu verstehen. Wenn Sie also keine völlig andere Frage haben, bin ich mir nicht sicher, wie dies nützlich sein könnte.a
Operator nach dem Dekrementieren überladen ist, der lvalue zurückgibt. coliru.stacked-crooked.com/a/e1effc351ae79e9fDies ist genau das gleiche wie
für nicht negative Zahlen
quelle
for(--x++;--x;++x--)
?unsigned
ist für--x++
hat undefiniertes Verhalten gemäß §1.9.15unsigned
, hätte es verwendet%u
Wie auch immer, wir haben jetzt einen "Gehe zu" -Operator.
"-->"
ist leicht als Richtung zu merken, und "während x auf Null geht" ist bedeutungsgerade.Darüber hinaus ist es etwas effizienter als
"for (x = 10; x > 0; x --)"
auf einigen Plattformen.quelle
for (size_t x=10; x-->0; )
dem Körper der Schleife wird mit 9,8, .., 0 ausgeführt, während die andere Version 10,9, .., 1 hat. Andernfalls ist es ziemlich schwierig, eine Schleife mit einer vorzeichenlosen Variablen auf Null zu verlassen.++>
, um die inkrementelle Arbeit zu erledigen.int
, so dass es Ihren Hund genauso leicht fressen kann wiex
auf Null nehmen , wenn er negativ anfängt.0
. (Zum Vergleich: Die Redewendung, Tests für Null wegzulassen, wie z. B. das Schreibenwhile (n--)
für unsignierte Testsn
, kauft Ihnen nichts und beeinträchtigt für mich die Lesbarkeit erheblich.) Es hat auch die angenehme Eigenschaft, dass Sie einen mehr als den Anfangsindex angeben , was normalerweise der Fall ist Sie möchten (z. B. für eine Schleife über ein Array geben Sie dessen Größe an). Ich mag es auch-->
ohne Platz, da dadurch die Redewendung leicht zu erkennen ist.Dieser Code vergleicht zuerst x und 0 und dekrementiert dann x. (Auch in der ersten Antwort gesagt: Sie dekrementieren x nach und vergleichen dann x und 0 mit dem
>
Operator.) Siehe die Ausgabe dieses Codes:Wir vergleichen und dekrementieren jetzt zuerst, indem wir 0 in der Ausgabe sehen.
Wenn wir zuerst dekrementieren und dann vergleichen möchten, verwenden Sie diesen Code:
Diese Ausgabe ist:
quelle
Mein Compiler druckt 9876543210 aus, wenn ich diesen Code ausführe.
Wie erwartet. Das
while( x-- > 0 )
heißt eigentlichwhile( x > 0)
. Diex--
Post dekrementiertx
.ist eine andere Art, dasselbe zu schreiben.
Es ist schön, dass das Original wie "während x auf 0 geht" aussieht.
quelle
while( x-- > 0 ) actually means while( x > 0)
- Ich bin mir nicht sicher, was Sie dort sagen wollten, aber die Art und Weise, wie Sie es formuliert haben, impliziert, dass das--
überhaupt keine Bedeutung hat, was offensichtlich sehr falsch ist.x
wird,-1
nachdem es die Schleife verlassen hat, während in dieser Antwort seinx
wird0
.Zwischen
--
und fehlt ein Leerzeichen>
.x
wird nach der Überprüfung des Zustands nachträglich dekrementiert, dh dekrementiertx>0 ?
.quelle
#define foo()
Versus#define foo ()
.--
ist der Dekrementierungsoperator und>
der Größer-als- Operator.Die beiden Operatoren werden wie ein einziger angewendet
-->
.quelle
Es ist eine Kombination aus zwei Operatoren. Erstens
--
dient es zum Dekrementieren des Werts und>
zum Überprüfen, ob der Wert größer als der rechte Operand ist.Die Ausgabe wird sein:
quelle
Ist tatsächlich
x
nach dem Dekrementieren und wird mit dieser Bedingung überprüft. Es ist nicht-->
, es ist(x--) > 0
Hinweis: Der Wert von
x
wird geändert, nachdem die Bedingung überprüft wurde, da er nach dem Dekrementieren erfolgt. Einige ähnliche Fälle können auch auftreten, zum Beispiel:quelle
x
bei 1 gestartetwhile ( (x--) > 0 )
würde , sondern würde es tun. {edit} Eric Lippert behandelte beide in seinen C # 4- VersionshinweisenC und C ++ befolgen die "Maximum Munch" -Regel. Genauso wie a --- b übersetzt wird
(a--) - b
, in Ihrem Fallx-->0
übersetzt in(x--)>0
.Die Regel besagt im Wesentlichen, dass Ausdrücke von links nach rechts gebildet werden, indem das Maximum an Zeichen verwendet wird, die einen gültigen Ausdruck bilden.
quelle
Warum all die Komplikationen?
Die einfache Antwort auf die ursprüngliche Frage lautet nur:
Macht das Gleiche. Das heißt nicht, dass Sie es so machen sollten, aber es macht das Gleiche und hätte die Frage in einem Beitrag beantwortet.
Das
x--
ist nur eine Abkürzung für das oben Genannte und>
ist nur ein normales Größer alsoperator
. Kein großes Rätsel!Es gibt heutzutage zu viele Leute, die einfache Dinge kompliziert machen;)
quelle
The OP's way: 9 8 7 6 5 4 3 2 1 0
undThe Garry_G way: 10 9 8 7 6 5 4 3 2 1
x=x-1
vorher,printf
dann können Sie sagen "es macht das gleiche".Auf herkömmliche Weise würden wir eine Bedingung in der
while
Schleifenklammer()
und eine Abschlussbedingung in den geschweiften Klammern definieren{}
, aber-->
beide gleichzeitig definieren.Zum Beispiel:
Dadurch wird
a
die Schleife dekrementiert und ausgeführt, solange siea
größer als ist0
.Herkömmlicherweise wäre es wie:
In beiden Fällen tun wir dasselbe und erreichen dieselben Ziele.
quelle
test-write-execute
wie in der Frage, danke für den Hinweis!(x --> 0)
meint(x-- > 0)
(x -->)
output -: 9 8 7 6 5 4 3 2 1 0
(-- x > 0)
Es ist gemein(--x > 0)
output -: 9 8 7 6 5 4 3 2 1
output -: 9 8 7 6 5 4 3 2 1
output -: 9 8 7 6 5 4 3 2 1 0
output -: 9 8 7 6 5 4 3 2 1 0
output -: 9 8 7 6 5 4 3 2 1 0
Ebenso können Sie viele Methoden ausprobieren, um diesen Befehl erfolgreich auszuführen
quelle