Što je operator "->" u C ++?

Nakon čitanja skrivenih značajki i tamnih kutova C ++ / STL-a na comp.> , bio sam potpuno iznenađen što se sljedeći isječak sastavlja i radi u oba Visual Studio 2008 i g ++ 4.4.

Evo koda:

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

Predlažem da je ovo C, jer radi u GCC-u. Gdje je definiran u standardu i odakle dolazi?

8054
29 окт. postavio GManNickG 29. listopada 2009-10-29 09:57 '09 u 9:57 am 2009-10-29 09:57
@ 25 odgovora

--> nije operator. Zapravo, to su dva odvojena operatora, -- i > .

Uvjetni kod smanjuje vrijednost x vraćajući izvornu (ne reduciranu) vrijednost x , a zatim uspoređuje izvornu vrijednost s 0 pomoću > operatora.

Da bismo bolje razumjeli izraz, možemo ga napisati na sljedeći način:

 while( (x--) > 0 ) 
7743
29 окт. odgovor dao Charles Salvia 29. listopada 2009-10-29 10:00 '09 u 10:00 2009-10-29 10:00

Ili za nešto sasvim drugo ... x pada na 0

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

Ne tako matematički, ali ... svaka slika crta tisuću riječi ...

2564
18 янв. odgovor je dan nesinkroniziran 18. siječnja 2012-01-18 14:18 '12 u 14:18 2012-01-18 14:18

To je vrlo složen operator, pa je čak i ISO / IEC JTC1 (Zajednički tehnički odbor 1) svoj opis stavio u dva različita dijela C ++ standarda.

Šaleći se u stranu, to su dva različita operatora: -- i > , opisana u odjeljku 5.2.6 / 2 i odjeljku 5.9 C ++ 03 standarda.

2265
29 окт. odgovor je dao Kirill V. Lyadvinsky 29. listopada. 2009-10-29 11:38 '09 u 11:38 sati 2009-10-29 11:38

To je jednako

 while (x-- > 0) 

x-- (nakon smanjenja) je ekvivalentno x = x-1 tako da se kod pretvara u:

 while(x > 0) { x = x-1; // logic } 
1183
29 окт. Odgovor je dao Jay Riggs 29. listopada. 2009-10-29 10:00 '09 u 10:00 2009-10-29 10:00

x može ići na nulu još brže u suprotnom smjeru:

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

8 6 4 2

Možete kontrolirati brzinu pomoću strelice!

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

90 80 70 60 50 40 30 20 10

)

961
28 дек. odgovor je dan 28 dec. 2014-12-28 03:32 '14 u 3:32 2014-12-28 03:32

Jeste

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

Samo prostor čini stvari zabavnim, smanjuje se i uspoređuje.

513
29 окт. odgovor je dat RageZ 29. listopada. 2009-10-29 10:00 '09 u 10:00 2009-10-29 10:00

Koristi --> ima povijesno značenje. Smanjenje je (i još uvijek je u nekim slučajevima) brže od povećanja x86 arhitekture. Koristeći --> , pretpostavite da se x približava 0 i odnosi se na one koji imaju matematičku pozadinu.

380
18 нояб. Odgovor je dao Matt Joiner 18. studenog. 2009-11-18 15:47 '09 u 15:47 2009-11-18 15:47
 while( x-- > 0 ) 

kako se analizira.

332
29 окт. odgovor od Grumdrig 29. listopada. 2009-10-29 10:00 '09 u 10:00 2009-10-29 10:00

Totalno geek, ali ja ću to upotrijebiti:

 #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 odgovor je dao Escualo 18. svibnja '10 u 23:33 2010-05-18 23:33

Jedna knjiga koju sam pročitao (ne sjećam se koje je knjige bila) navodi: Kompilatori pokušavaju raščlaniti izraze u najveći token pomoću pravila lijevo-lijevo.

U ovom slučaju, izraz:

 x-->0 

Parsis za najveće tokene:

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

Isto pravilo vrijedi i za ovaj izraz:

 a-----b 

Nakon raščlanjivanja:

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

Nadam se da ovo pomaže u razumijevanju složenog izraza ^^

291
09 апр. odgovor je dao NguyenDat 09 Apr 2010-04-09 03:04 '10 u 3:04 2010-04-09 03:04

To je točno isto kao i

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

za negativne brojeve

246
31 дек. Odgovor daje Dobra osoba 31. prosinca. 2009-12-31 16:48 '10 u 16:48 2009-12-31 16:48

U svakom slučaju, sada imamo operatora koji "dolazi". "-->" lako se pamti kao smjer, a "dok x nestaje" znači "jednostavno".

Osim toga, on je nešto učinkovitiji od "for (x = 10; x > 0; x --)" na nekim platformama.

224
29 окт. odgovor dan Test 29. \ t 2009-10-29 17:45 '09 u 17:45 2009-10-29 17:45

Ovaj kod najprije uspoređuje x i 0, a zatim smanjuje x. (Isto tako, prvi odgovor glasi: vi post-smanjenje x, a zatim usporedite x i 0 s operatorom > .) Vidi Izlaz ovog koda:

 9 8 7 6 5 4 3 2 1 0 

Sada prvo uspoređujemo i zatim smanjimo, vidimo 0 na izlazu.

Ako želimo prvo smanjiti, a zatim usporediti, upotrijebite ovaj kôd:

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

Ovaj zaključak:

 9 8 7 6 5 4 3 2 1 
206
18 нояб. Odgovor je dao Sajad Bahmani 18. studenog 2009-11-18 15:52 '09 u 15:52 2009-11-18 15:52

Moj prevodilac će ispisati 9876543210 kada pokrenete ovaj kôd.

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

Kao što se i očekivalo. Vrijednost while( x-- > 0 ) znači while( x > 0) . x x-- x .

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

- Ovo je još jedan način da se napiše ista stvar.

Lijepo je da izvornik izgleda kao "dok x ide na 0".

160
17 янв. odgovor je dan cool_me5000 17 jan. 2010-01-17 03:46 '10 u 3:46 2010-01-17 03:46

Nema razmaka između -- i > . x post je smanjen, tj. smanjuje se nakon provjere uvjeta x>0 ? ,

133
odgovor se daje gospodinu 28 дек. X 28. prosinca 2009-12-28 19:32 '10 u 19:32 2009-12-28 19:32

-- - operator operator, i - - operater više .

Primjenjuju se dva operatora kao jedan, na primjer --> .

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

Ovo je kombinacija dvaju operatora. Prvi -- namijenjen smanjenju vrijednosti i > provjeriti je li vrijednost veća od desnog operanda.

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

Izlaz će biti:

 9 8 7 6 5 4 3 2 1 0 
117
02 апр. Odgovor Rajeev Das 02. travnja. 2013-04-02 14:22 '13 u 14:22 2013-04-02 14:22

Zapravo, x post-smanjen i ovaj uvjet je provjeren. To nije --> , to (x--) > 0

Napomena: vrijednost x mijenja nakon provjere uvjeta, budući da je naknadno smanjena. Mogu se pojaviti i neki slični slučajevi, na primjer:

 --> x-->0 ++> x++>0 -->= x-->=0 ++>= x++>=0 
112
18 авг. Odgovor daje AndroidLearner 18 aug. 2012-08-18 10:34 '12 u 10:34 am 2012-08-18 10:34

C i C ++ slijede pravilo "maksimalno žvakanje". Kao što je --- b prevedeno na (a--) - b , u vašem slučaju x-->0 prevodi u (x--)>0 .

Ono što pravilo u biti kaže jest da se kretanje s lijeva na desno, izrazi formiraju usvajanjem maksimuma simbola koji će oblikovati ispravan izraz.

105
10 февр. Odgovor daje Pandrei 10. veljače. 2014-02-10 20:29 '14 u 20:29 2014-02-10 20:29

Zašto sve komplikacije?

Jednostavan odgovor na izvorno pitanje:

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

Ista stvar. Ne govoreći da to trebate učiniti ovako, ali on radi isto i odgovorio bi na jedno pitanje.

x-- je samo kratica za gore navedeno, i > je samo normalnija od x-- operator . Nema velikih tajni!

Trenutno ima previše ljudi koji rade jednostavne stvari;)

23
27 окт. Odgovor je dan / a . 2016-10-27 18:09 '16 u 18:09 2016-10-27 18:09

Na uobičajeni način definiramo uvjet u zagradama petlje " () " i uvjet završetka unutar vitičastih zagrada " {} ", ali ovo i > je način na koji svatko definira sve odjednom. Na primjer, na primjer:

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

On kaže, smanjuje i započinje ciklus sve dok vrijeme a veće od 0

Drugi je način trebao biti:

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

u oba smjera radimo isto i postižemo iste ciljeve.

20
28 мая '17 в 23:10 2017-05-28 23:10 odgovor je dan Zohaib Ejaz 28. svibnja '17 u 23:10 2017-05-28 23:10

C / C ++ ignorira prostore s uvjetom. U osnovi, kod

 while (x --> 0) 

isti je kao

 while (x-- > 0) 

ili

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

Korištenje post-decment u stanju. Neka je x = 10 . Operator uvjeta bit će 10>0 i printf("%d ", x); operater u petlji će dati 9 u prvoj vožnji. Za drugu vožnju, uvjet će biti 9>0 i pečat će biti jednak 8 i tako dalje do uvjeta 0>0 .

0
06 сент. odgovor je dat Zirc 06 sep. 2018-09-06 00:20 '18 u 0:20 2018-09-06 00:20

--> je u osnovi ista stvar kao:

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

možete pronaći sve brojeve između x i danog broja.

-1
Odgovor koji je dao Aleks. 14 апр. S. Apr 14 2018-04-14 21:59 '18 u 21:59 2018-14-14 21:59

Ako ste morali napisati funkciju za obrnuto, sintaksa je mnogo očitija, da ne spominjem da ne mislim da sam je vidio prije:

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

rezultat:

11 12 13 14 15 16 17 18 19 20

-1
13 июля '18 в 18:34 2018-07-13 18:34 TrevorLee je odgovorio 13. srpnja '18 u 18:34 sati 2018-07-13 18:34

Zapravo → nijedan operater. Ovo je kombinacija dva odvojena operatora - i>

Uzmimo primjer. Dok (x → 0) Ovo je jedan povjerljivi izraz s jednom potvrdom. Ovdje je prvi x smanjenje s njegovom vrijednošću, a zatim u usporedbi s 0.

-4
06 дек. Odgovor dao Lovekush Vishwakarma Prosinac 06 2017-12-06 16:45 '17 u 16:45 2017-12-06 16:45

Ostala pitanja o oznakama ili Postavi pitanje