Was ist der Operator "->" in C ++?

Nachdem ich Hidden Features und Dark Corners von C ++ / STL unter comp.> , war ich völlig überrascht, dass das folgende Snippet in Visual Studio 2008 und g ++ 4.4 kompiliert wurde.

Hier ist der Code:

 #include <stdio.h> int main() { int x = 10; while (x --> 0) // x goes to 0 { printf("%d ", x); } } 

Ich würde vorschlagen, dass dies C ist, da es in GCC funktioniert. Wo ist es in der Norm definiert und woher kommt es?

8054
29 окт. eingestellt von GManNickG 29 oct. 2009-10-29 09:57 09 um 09:57 Uhr 2009-10-29 09:57
@ 25 Antworten

--> kein Operator. In der Tat sind dies zwei getrennte Operatoren -- und > .

Ein bedingter Code reduziert den Wert von x indem er den ursprünglichen (nicht reduzierten) Wert von x zurückgibt, und vergleicht dann den ursprünglichen Wert mit dem Operator > mit 0 .

Zum besseren Verständnis kann der Ausdruck wie folgt geschrieben werden:

 while( (x--) > 0 ) 
7743
29 окт. Antwort an Charles Salvia vom 29. Oktober 2009-10-29 10:00 09 um 10:00 Uhr 2009-10-29 10:00 Uhr

Oder für etwas ganz anderes ... x rutscht auf 0

 while (x --\ \ \ \ > 0) printf("%d ", x); 
border=0

Nicht so mathematisch, aber ... jedes Bild zieht tausend Worte ...

2564
18 янв. Die Antwort wird nicht synchronisiert am 18. Januar gegeben 2012-01-18 14:18 '12 am 14:18 2012-01-18 14:18

Dies ist ein sehr komplexer Operator, so dass selbst das ISO / IEC JTC1 (Joint Technical Committee 1) seine Beschreibung in zwei verschiedenen Teilen des C ++ - Standards auflistete.

Zum Spaß sind dies zwei verschiedene Operatoren: -- und > , die in Abschnitt 5.2.6 / 2 bzw. in Abschnitt 5.9 des C ++ 03-Standards beschrieben werden.

2265
29 окт. Die Antwort gibt Kirill V. Lyadvinsky am 29. Oktober. 2009-10-29 11:38 09 um 11:38 Uhr 2009-10-29 11:38

Das ist äquivalent zu

 while (x-- > 0) 

x-- (nach Dekrement) entspricht x = x-1 daher wird der Code in x-- konvertiert:

 while(x > 0) { x = x-1; // logic } 
1183
29 окт. Die Antwort wird von Jay Riggs am 29. Oktober gegeben. 2009-10-29 10:00 09 um 10:00 Uhr 2009-10-29 10:00 Uhr

x kann in umgekehrter Richtung noch schneller gegen Null gehen:

 int x = 10; while( 0 <---- x ) { printf("%d ", x); } 

8 6 4 2

Sie können die Geschwindigkeit mit dem Pfeil steuern!

 int x = 100; while( 0 <-------------------- x ) { printf("%d ", x); } 

90 80 70 60 50 40 30 20 10

;)

961
28 дек. die antwort ist doc 28 dec gegeben. 2014-12-28 03:32 '14 am 3:32 2014-12-28 03:32

Das

 #include <stdio.h> int main(void){ int x = 10; while( x-- > 0 ){ // x goes to 0 printf("%d ", x); } return 0; } 

Nur der Platz macht Spaß, verringert und vergleicht.

513
29 окт. Die Antwort ist RageZ 29 Okt. gegeben . 2009-10-29 10:00 09 um 10:00 Uhr 2009-10-29 10:00 Uhr

Verwendung --> hat historische Bedeutung. Das Dekrementieren war (und ist in einigen Fällen immer noch schneller) als das Inkrementieren der x86-Architektur. Nehmen Sie mit --> , dass x 0 und sich auf diejenigen bezieht, die einen mathematischen Hintergrund haben.

380
18 нояб. Die Antwort wird von Matt Joiner am 18. November gegeben. 2009-11-18 15:47 09 um 15:47 Uhr 2009-11-18 15:47 Uhr
 while( x-- > 0 ) 

wie es analysiert wird.

332
29 окт. Antwort von Grumdrig 29. Oktober. 2009-10-29 10:00 09 um 10:00 Uhr 2009-10-29 10:00 Uhr

Total Geek, aber ich werde dies verwenden:

 #define as ;while int main(int argc, char* argv[]) { int n = atoi(argv[1]); do printf("n is %d\n", n) as ( n --> 0); return 0; } 
310
18 мая '10 в 23:33 2010-05-18 23:33 Die Antwort wird von Escualo am 18. Mai 2010 um 23:33 Uhr 2010-05-18 23:33 gegeben

Ein Buch, das ich gelesen habe (ich kann mich nicht erinnern, welches Buch es war) stellte fest: Compiler versuchen, Ausdrücke mithilfe der Links-Links-Regel in das größte Token zu parsen .

In diesem Fall lautet der Ausdruck:

 x-->0 

Parsis für die größten Spielmarken:

 token 1: x token 2: -- token 3: > token 4: 0 conclude: x-- > 0 

Die gleiche Regel gilt für diesen Ausdruck:

 a-----b 

Nach dem Parsing:

 token 1: a token 2: -- token 3: -- token 4: - token 5: b conclude: (a--)-- - b 

Ich hoffe, das hilft, den komplexen Ausdruck zu verstehen ^^

291
09 апр. Die Antwort wird von NguyenDat 09 Apr gegeben 2010-04-09 03:04 '10 am 3:04 2010-04-09 03:04

Es ist genau das gleiche wie

 while (x--) { printf("%d ", x); } 

für nicht negative Zahlen

246
31 дек. Die Antwort wird am 31. Dezember von Good Person gegeben. 2009-12-31 16:48 '10 am 16:48 2009-12-31 16:48

In jedem Fall haben wir jetzt einen Operator, der "kommt". "-->" als Richtung leicht zu merken, und "während x verschwindet" bedeutet "direkt".

Außerdem ist es auf einigen Plattformen etwas effizienter als "for (x = 10; x > 0; x --)" .

224
29 окт. Antwort gegeben Test 29. Oktober 2009-10-29 17:45 09 um 17:45 2009-10-29 17:45

Dieser Code vergleicht zuerst x und 0 und dekrementiert dann x. (Die erste Antwort lautet außerdem: Sie dekodieren x und vergleichen dann x und 0 mit dem Operator > .) Siehe Ausgabe dieses Codes:

 9 8 7 6 5 4 3 2 1 0 

Jetzt vergleichen wir zuerst und verringern dann, wobei wir 0 am Ausgang sehen.

Wenn wir zuerst reduzieren und dann vergleichen wollen, verwenden Sie diesen Code:

 #include <stdio.h> int main(void) { int x = 10; while( --x> 0 ) // x goes to 0 { printf("%d ", x); } return 0; } 

Diese Schlussfolgerung:

 9 8 7 6 5 4 3 2 1 
206
18 нояб. Die Antwort wird am 18. November von Sajad Bahmani gegeben 2009-11-18 15:52 09 um 15:52 Uhr 2009-11-18 15:52 Uhr

Mein Compiler druckt 9876543210, wenn Sie diesen Code ausführen.

 #include <iostream> int main() { int x = 10; while( x --> 0 ) // x goes to 0 { std::cout << x; } } 

Wie erwartet Der Wert while( x-- > 0 ) bedeutet while( x > 0) . x-- post dekrementiert x .

 while( x > 0 ) { x--; std::cout << x; } 

- Dies ist eine andere Möglichkeit, das Gleiche zu schreiben.

Es ist schön, dass das Original so aussieht als "x geht auf 0".

160
17 янв. die antwort ist cool_me5000 17 jan gegeben. 2010-01-17 03:46 '10 am 3:46 2010-01-17 03:46

Zwischen -- und > -- kein Leerzeichen. x Posten wird dekrementiert, d.h. sinkt nach Überprüfung der Bedingung x>0 ? .

133
Die Antwort wird Herrn gegeben 28 дек. X 28 Dez 2009-12-28 19:32 '10 am 19:32 2009-12-28 19:32

-- Operator dekrementieren und > - Operator mehr .

Zwei Operatoren werden zum Beispiel als eins angewendet --> .

124
06 апр. antworten sam 06 apr. 2010-04-06 13:45 '10 um 13:45 2010-04-06 13:45

Dies ist eine Kombination aus zwei Operatoren. Die erste soll den Wert reduzieren und > prüfen, ob der Wert größer als der rechte Operand ist.

 #include<stdio.h> int main() { int x = 10; while (x-- > 0) printf("%d ",x); return 0; } 

Die Ausgabe wird sein:

 9 8 7 6 5 4 3 2 1 0 
117
02 апр. Antwort von Rajeev Das 02 Apr. 2013-04-02 14:22 13 am 02.22 Uhr 2013-04-02 14:22

Tatsächlich wird x nach dekrementiert und diese Bedingung wird geprüft. Es ist nicht --> , es (x--) > 0

Hinweis: Der Wert von x ändert sich nach der Überprüfung der Bedingung, da er nach dekrementiert wird. Einige ähnliche Fälle können auch auftreten, zum Beispiel:

 --> x-->0 ++> x++>0 -->= x-->=0 ++>= x++>=0 
112
18 авг. Die Antwort wird von AndroidLearner 18 aug gegeben. 2012-08-18 10:34 '12 um 10:34 Uhr 2012-08-18 10:34 Uhr

C und C ++ folgen der Regel "Maximum Munch". So wie --- b zu (a--) - b , wird in Ihrem Fall x-->0 zu (x--)>0 .

Die Regel besagt im Wesentlichen, dass bei der Bewegung von links nach rechts Ausdrücke gebildet werden, indem ein Maximum von Zeichen angenommen wird, die den korrekten Ausdruck bilden.

105
10 февр. Die Antwort wird von Pandrei am 10. Februar gegeben. 2014-02-10 20:29 14 am 20:29 2014-02-10 20:29

Warum alle Komplikationen?

Eine einfache Antwort auf die ursprüngliche Frage:

 #include <stdio.h> int main() { int x = 10; while (x > 0) { printf("%d ", x); x = x-1; } } 

Tut das gleiche Nicht zu sagen, dass Sie es so machen sollten, aber er tut dasselbe und würde eine Frage beantworten.

x-- ist nur eine Abkürzung für das Obige und > ist nur normaler als der operator x-- . Keine großen Geheimnisse!

Es gibt zu viele Leute, die im Moment einfache Dinge tun;)

23
27 окт. Die Antwort ist Garry_G 27. Oktober gegeben. 2016-10-27 18:09 '16 um 18:09 Uhr 2016-10-27 18:09

In der üblichen Weise definieren wir die Bedingung in den Klammern der " () " - Schleife und die Beendigungsbedingung in den geschweiften Klammern " {} ", aber dies und > ist die Weise, auf die jeder auf einmal alles definiert. Zum Beispiel:

 int abc(){ int a = 5 while((a--) > 0){ // Decrement and comparison both at once // Code } } 

Es sagt, reduziert a und startet den Zyklus, bis der Zeitpunkt a größer als 0

Ein anderer Weg hätte sein sollen:

 int abc(){ int a = 5 while(a > 0){ // Code a = a -1 // Decrement inside loop } } 

In beiden Richtungen machen wir dasselbe und erreichen dieselben Ziele.

20
28 мая '17 в 23:10 2017-05-28 23:10 Die Antwort wird gegeben Zohaib Ejaz 28. Mai '17 um 23:10 2017-05-28 23:10

C / C ++ ignoriert Leerzeichen mit Bedingung. Im Wesentlichen der Code

 while (x --> 0) 

es ist das gleiche wie

 while (x-- > 0) 

oder

 while(x > 0){ x = x - 1 ... 

Verwenden der Nachdekrementierung im Zustand. Sagen wir x = 10 . Der Bedingungsoperator ist 10>0 und printf("%d ", x); Der Operator in der Schleife gibt im ersten Durchlauf 9 aus. Für den zweiten Durchlauf ist die Bedingung 9>0 und die Versiegelung ist gleich 8 usw. bis die Bedingung 0>0 .

0
06 сент. die antwort ist gegeben zirc 06 sep. 2018-09-06 00:20 18 um 0:20 2018-09-06 00:20

--> ist im Grunde dasselbe wie:

  for(x=10; x<1; ++x) cout<<x 

Sie finden alle Zahlen zwischen x und der angegebenen Zahl.

-1
Antwort von Aleks. 14 апр. S. 14. April 2018-04-14 21:59 18 um 21:59 Uhr 2018-14-14 21:59 Uhr

Wenn Sie für die Umkehrung eine Funktion schreiben mussten, ist die Syntax viel offensichtlicher, ganz zu schweigen davon, dass ich nicht glaube, dass ich sie schon einmal gesehen habe:

  #include <stdio.h> int main() { int x {10}; while (x ++< 20) // x increments to 20 { printf("%d ", x); } } 

Ergebnis:

11 12 13 14 15 16 17 18 19 20

-1
13 июля '18 в 18:34 2018-07-13 18:34 TrevorLee antwortete am 13. Juli 18 um 18:34 Uhr 2018-07-13 18:34

Eigentlich → kein einziger Operator. Dies ist eine Kombination aus zwei separaten Operatoren - und>

Nehmen wir ein Beispiel. While (x → 0) Dies ist ein vertraulicher Ausdruck mit einer Bestätigung. Hier ist das erste x das Dekrement mit seinem Wert und wird dann mit 0 verglichen.

-4
06 дек. Antwort von Lovekush Vishwakarma 06. Dezember 2017-12-06 16:45 '17 um 16:45 Uhr 2017-12-06 16:45

Weitere Fragen zu Tags oder Frage stellen