border=0

"77.95.5.4 - 77.95.5.4"

Wat is de "->" -operator in C ++?

Na het lezen van Verborgen functies en Dark Corners van C ++ / STL op comp.> was ik volledig verrast dat het volgende fragment compileerde en werkte in zowel Visual Studio 2008 als g ++ 4.4.

Hier is de code:

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

Ik zou willen voorstellen dat dit C is, omdat het werkt in GCC. Waar wordt het gedefinieerd in de standaard en waar komt het vandaan?

8218
29 окт. ingesteld door GManNickG 29 oct. 2009-10-29 09:57 '09 om 9:57 uur 2009-10-29 09:57 uur
@ 25 antwoorden

--> geen operator. In feite zijn dit twee afzonderlijke operatoren, -- en > .

Een voorwaardelijke code vermindert de waarde van x door de oorspronkelijke (niet-verlaagde) waarde van x retourneren en vergelijkt vervolgens de oorspronkelijke waarde met 0 met de operator > .

Om de uitdrukking beter te begrijpen, kan deze als volgt worden geschreven:

 while( (x--) > 0 ) 
7904
29 окт. antwoord gegeven aan Charles Salvia op 29 oktober 2009-10-29 10:00 '09 om 10:00 2009-10-29 10:00

Of voor iets heel anders ... x glijdt naar 0

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

Niet zo wiskundig, maar ... elke foto trekt duizend woorden ...

2683
18 янв. het antwoord wordt niet- gesynchroniseerd gegeven op 18 januari 2012-01-18 14:18 '12 om 14:18 2012-01-18 14:18

Dit is een zeer complexe operator, dus zelfs de ISO / IEC JTC1 (Joint Technical Committee 1) plaatste zijn beschrijving in twee verschillende delen van de C ++ -standaard.

Een grapje terzijde, dit zijn twee verschillende operatoren: -- en > , respectievelijk beschreven in sectie 5.2.6 / 2 en in sectie 5.9 van de C ++ 03-standaard.

2291
29 окт. het antwoord wordt gegeven door Kirill V. Lyadvinsky op 29 oktober. 2009-10-29 11:38 '09 om 11:38 uur 2009-10-29 11:38 uur

Dit komt overeen met

 while (x-- > 0) 

x-- (na decrement) is gelijk aan x = x-1 dus de code wordt geconverteerd naar:

 while(x > 0) { x = x-1; // logic } 
1206
29 окт. het antwoord wordt gegeven door Jay Riggs op 29 oktober. 2009-10-29 10:00 '09 om 10:00 2009-10-29 10:00

x kan nog sneller naar nul gaan in de tegenovergestelde richting:

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

8 6 4 2

Je kunt de snelheid besturen met de pijl!

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

90 80 70 60 50 40 30 20 10

;)

1007
28 дек. het antwoord wordt gegeven op 28 dec. 2014-12-28 03:32 '14 om 3:32 2014-12-28 03:32

Dat is het

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

Alleen ruimte maakt dingen leuk, vermindert en vergelijkt.

523
29 окт. het antwoord wordt gegeven door RageZ op 29 oktober. 2009-10-29 10:00 '09 om 10:00 2009-10-29 10:00

Gebruik --> heeft historische betekenis. Decrementering was (en is nog steeds in sommige gevallen) sneller dan het verhogen van de x86-architectuur. Met --> wordt aangenomen dat x 0 nadert en verwijst naar degenen met een wiskundige achtergrond.

391
18 нояб. Het antwoord wordt gegeven door Matt Joiner op 18 nov. 2009-11-18 15:47 '09 om 15:47, 2009-11-18 15:47
 while( x-- > 0 ) 

hoe het wordt geanalyseerd.

342
29 окт. antwoord gegeven door Grumdrig 29 oktober 2009-10-29 10:00 '09 om 10:00 2009-10-29 10:00

Totaal nerd, maar ik zal dit gebruiken:

 #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; } 
321
18 мая '10 в 23:33 2010-05-18 23:33 het antwoord wordt gegeven door Escualo op 18 mei '10 om 23:33 2010-05-18 23:33

Een boek dat ik heb gelezen (ik weet niet meer welk boek het was) heeft verklaard: compilers proberen expressies te ontleden in het grootste token met behulp van de linkerlinksregel.

In dit geval is de uitdrukking:

 x-->0 

Parsis voor de grootste tokens:

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

Dezelfde regel is van toepassing op deze uitdrukking:

 a-----b 

Na het ontleden:

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

Ik hoop dat dit helpt om de complexe uitdrukking te begrijpen ^^

299
09 апр. het antwoord wordt gegeven door NguyenDat 09 april 2010-04-09 03:04 '10 om 3:04 2010-04-09 03:04

Het is precies hetzelfde als

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

voor niet-negatieve getallen

251
31 дек. Het antwoord wordt gegeven door Good Person op 31 december. 2009-12-31 16:48 '10 om 16:48, 2009-12-31 16:48

In ieder geval hebben we nu een operator die "aankomt". "-->" gemakkelijk te onthouden als een richting en "terwijl x naar nul gaat" betekent "rechttoe rechtaan".

Bovendien is het op sommige platforms iets efficiënter dan "for (x = 10; x > 0; x --)" .

230
29 окт. antwoord gegeven Test 29 oktober. 2009-10-29 17:45 '09 om 17:45 2009-10-29 17:45

Deze code vergelijkt eerst x en 0 en verlaagt vervolgens x. (Ook het eerste antwoord zegt: u post-decrement x, en vergelijk x en 0 met de operator > .) Zie de uitvoer van deze code:

 9 8 7 6 5 4 3 2 1 0 

Nu vergelijken we eerst en verlagen we vervolgens, waarbij we 0 zien aan de uitgang.

Als we eerst willen verkleinen en dan vergelijken, gebruik dan deze code:

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

Deze conclusie:

 9 8 7 6 5 4 3 2 1 
212
18 нояб. Het antwoord wordt gegeven door Sajad Bahmani 18 november 2009-11-18 15:52 '09 om 15:52 2009-11-18 15:52

Mijn compiler zal 9876543210 afdrukken wanneer deze code wordt uitgevoerd.

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

Zoals verwacht. De waarde while( x-- > 0 ) betekent while( x > 0) . x-- post decrements x .

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

- Dit is een andere manier om hetzelfde te schrijven.

Het is goed dat het origineel eruit ziet als "terwijl x naar 0 gaat".

165
17 янв. het antwoord is cool_me5000 17 jan. 2010-01-17 03:46 '10 om 3:46 2010-01-17 03:46

Er -- geen spatie tussen -- en > . x post is verlaagd, d.w.z. neemt af na het controleren van de conditie x>0 ? .

138
het antwoord wordt gegeven aan Mr. 28 дек. X 28 dec 2009-12-28 19:32 '10 om 19:32 2009-12-28 19:32

-- - verlaging van de operator, en > - operator meer .

Twee operatoren worden als één toegepast, bijvoorbeeld --> .

129
06 апр. het antwoord is gegeven sam 06 apr. 2010-04-06 13:45 '10 om 13:45 uur 2010-04-06 13:45 uur

Dit is een combinatie van twee operatoren. De eerste -- bedoeld om de waarde te verminderen en > om te controleren of de waarde groter is dan de rechter operand.

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

De uitvoer zal zijn:

 9 8 7 6 5 4 3 2 1 0 
123
02 апр. Het antwoord wordt gegeven door Rajeev Das 02 apr. 2013-04-02 14:22 '13 om 14:22 uur 2013-04-02 14:22

In feite is x post-decrement en wordt deze voorwaarde gecontroleerd. Het is niet --> , it (x--) > 0

Opmerking: de waarde van x verandert na het controleren van de voorwaarde, omdat deze post-decrement is. Sommige soortgelijke gevallen kunnen ook voorkomen, bijvoorbeeld:

 --> x-->0 ++> x++>0 -->= x-->=0 ++>= x++>=0 
117
18 авг. Het antwoord wordt gegeven door AndroidLearner 18 aug. 2012-08-18 10:34 '12 om 10:34 uur 2012-08-18 10:34

C en C ++ volgen de "maximum munch" -regel. Op dezelfde manier als --- b wordt vertaald naar (a--) - b , wordt in uw geval x-->0 vertaald naar (x--)>0 .

Wat de regel in essentie zegt, is dat de beweging van links naar rechts, uitdrukkingen worden gevormd door het aannemen van een maximum aantal tekens dat de juiste uitdrukking zal vormen.

113
10 февр. Het antwoord wordt gegeven door Pandrei 10 februari. 2014-02-10 20:29 '14 om 20:29 2014-02-10 20:29

Waarom alle complicaties?

Een eenvoudig antwoord op de oorspronkelijke vraag:

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

Doet hetzelfde. Niet om te zeggen dat je het zo zou moeten doen, maar hij doet hetzelfde en beantwoordt één vraag.

x-- is slechts een afkorting van het bovenstaande en > is gewoon normaal meer dan x-- operator . Geen grote geheimen!

Er zijn te veel mensen die simpele dingen doen die op dit moment ingewikkeld zijn;)

27
27 окт. Antwoord krijgt Garry_G 27 okt. 2016-10-27 18:09 '16 om 18:09 uur 2016-10-27 18:09 uur

Op de gebruikelijke manier definiëren we de voorwaarde tussen haakjes van de " () " -lus en de beëindigingstoestand binnen de accolades " {} ", maar dit en > is de manier waarop iedereen alles in één keer definieert. Bijvoorbeeld, bijvoorbeeld:

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

Het zegt, vermindert a en start de cyclus totdat de tijd a groter is dan 0

Een andere manier zou moeten zijn:

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

in beide richtingen doen we hetzelfde en bereiken we dezelfde doelen.

23
28 мая '17 в 23:10 2017-05-28 23:10 het antwoord is gegeven Zohaib Ejaz 28 mei '17 om 23:10 2017-05-28 23:10

C / C ++ negeert spaties met een voorwaarde. Kortom, de code

 while (x --> 0) 

het is hetzelfde als

 while (x-- > 0) 

of

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

Post-decrement gebruiken. Laten we zeggen x = 10 . De condition-operator is 10>0 en printf("%d ", x); de operator in de lus geeft 9 in de eerste run. Voor de tweede run is de voorwaarde 9>0 en is de verzegeling gelijk aan 8 enzovoort tot de conditie 0>0 .

0
06 сент. het antwoord is gegeven Zirc 06 sep. 2018-09-06 00:20 '18 om 0:20 2018-09-06 00:20

Als je een functie moet schrijven om het omgekeerde te doen, is de syntaxis veel duidelijker, om nog te zwijgen van het feit dat ik niet denk dat ik het eerder heb gezien:

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

resultaat:

11 12 13 14 15 16 17 18 19 20

-1
13 июля '18 в 18:34 2018-07-13 18:34 TrevorLee antwoordde op 13 juli '18 om 18.34 uur 2018-07-13 18:34

--> is in principe hetzelfde als:

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

je vindt alle getallen tussen x en het opgegeven nummer.

-1
Antwoord gegeven door Aleks. 14 апр. S. 14 april 2018-04-14 21:59 '18 om 21:59 uur 2018-14-14 21:59

Eigenlijk → niet één operator. Dit is een combinatie van twee afzonderlijke operatoren - en>

Laten we een voorbeeld nemen. While (x → 0) Dit is een vertrouwelijke expressie met één bevestiging. Hier wordt de eerste x verlaagd met zijn waarde en vervolgens vergeleken met 0.

-4
06 дек. Antwoord gegeven door Lovekush Vishwakarma 06 december 2017-12-06 16:45 17 om 16.45 uur 2017-12-06 16:45 uur

Zie andere vragen over of Stel een vraag