Kas yra „->“ operatorius „C ++“?

Perskaitę paslėptas C ++ / STL ypatybes ir tamsius kampus comp.> , buvau visiškai nustebęs, kad šis fragmentas sudarė ir dirbo Visual Studio 2008 ir g ++ 4.4.

Čia yra kodas:

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

Manau, kad tai yra C, kaip ji veikia GCC. Kur jis apibrėžtas standarte ir iš kur jis kilęs?

8054
29 окт. nustatė GManNickG 29 okt. 2009-10-29 09:57 '09 9:57 am. 2009-10-29 09:57
@ 25 atsakymai

--> nėra operatorius. Tiesą sakant, tai yra du atskiri operatoriai, -- ir > .

Sąlyginis kodas sumažina x vertę, grąžindamas pradinę (ne sumažintą) x vertę, ir tada lygina pradinę vertę su 0 naudodamas > operatorių.

Norėdami geriau suprasti šią išraišką, galite rašyti taip:

 while( (x--) > 0 ) 
7743
29 окт. Charles Salvia atsakymas, pateiktas spalio 29 d 2009-10-29 10:00 '09 10:00 val. 2009-10-29 10:00

Arba kažką visiškai kitokio ... x paslydo į 0

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

Ne taip matematiškai, bet ... kiekviena nuotrauka atkreipia tūkstančius žodžių ...

2564
18 янв. atsakymas pateikiamas nesinchronizuotu sausio 18 d 2012-01-18 14:18 '12, 14:18, 2012-01-18 14:18

Tai labai sudėtingas operatorius, taigi net ISO / IEC JTC1 (Jungtinis techninis komitetas 1) savo aprašą pateikė dviejose skirtingose ​​C ++ standarto dalyse.

Įsijungimas į šoną - tai du skirtingi operatoriai: -- ir > , aprašyti atitinkamai 5.2.6 / 2 skirsnyje ir C ++ 03 standarto 5.9 skyriuje.

2265
29 окт. spalio 29 d. atsakymą pateikė Kirilas V. Lyadvinsky . 2009-10-29 11:38 '09 11:38 am 2009-10-29 11:38

Tai atitinka

 while (x-- > 0) 

x-- (po x-- ) yra lygus x = x-1 todėl kodas konvertuojamas į:

 while(x > 0) { x = x-1; // logic } 
1183
29 окт. Atsakymą pateikė Jay Riggs, spalio 29 d. 2009-10-29 10:00 '09 10:00 val. 2009-10-29 10:00

x gali eiti į nulį dar greičiau priešinga kryptimi:

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

8 6 4 2

Jūs galite valdyti greitį rodykle!

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

90 80 70 60 50 40 30 20 10

;)

961
28 дек. atsakymas pateikiamas 28 d. 2014-12-28 03:32 '14, 3:32 2014-12-28 03:32

Tai yra

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

Tiesiog erdvė daro įdomus, mažėja ir > lygina.

513
29 окт. atsakymas pateikiamas RageZ 29 okt. 2009-10-29 10:00 '09 10:00 val. 2009-10-29 10:00

Naudojimas --> turi istorinę reikšmę. Sumažinimas buvo (ir vis tiek yra) greitesnis nei x86 architektūros didinimas. Naudodamiesi --> darome prielaidą, kad x artėja prie 0 ir reiškia matematinį foną.

380
18 нояб. Atsakymą pateikė Matt Joiner lapkričio 18 d. 2009-11-18 15:47 '09 15:47 2009-11-18 15:47
 while( x-- > 0 ) 

kaip ji analizuojama.

332
29 окт. atsakymas, kurį pateikė Grumdrig, spalio 29 d. 2009-10-29 10:00 '09 10:00 val. 2009-10-29 10:00

Visiškai, bet aš naudosiu tai:

 #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 atsakymą pateikė „ Escualo “ gegužės 18 d. 10 val. 23:33 2010-05-18 23:33

Vienoje knygoje, kurią perskaičiau (aš nepamenu, kokia knyga buvo), kompiliatoriai stengiasi išnagrinėti išraiškas į didžiausią simbolį naudodami kairiąją kairę taisyklę.

Tokiu atveju:

 x-->0 

Parsis už didžiausius žetonus:

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

Ta pati taisyklė taikoma šiai išraiškai:

 a-----b 

Išnagrinėjus:

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

Tikiuosi, kad tai padės suprasti sudėtingą išraišką ^^

291
09 апр. atsakymą pateikė NguyenDat 09 Bal 2010-04-09 03:04 '10, 3:04, 2010-04-09 03:04

Tai lygiai taip pat

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

ne neigiamų skaičių

246
31 дек. Atsakymą pateikė geras asmuo gruodžio 31 d. 2009-12-31 16:48 '10, 16:48, 2009-12-31 16:48

Bet kuriuo atveju, dabar mes turime operatorių „ateinančią“. "-->" lengva prisiminti kaip kryptį, o „o x išnyksta“ reiškia „paprastą“.

Be to, kai kuriose platformose jis yra šiek tiek efektyvesnis už "for (x = 10; x > 0; x --)" .

224
29 окт. atsakymas duotas Test 29 spalis. 2009-10-29 17:45 '09, 17:45 2009-10-29 17:45

Šis kodas pirmiausia lygina x ir 0, o tada mažina x. (Be to, pirmasis atsakymas sako: jūs po skelbimo sumažinimo x, o tada palyginkite x ir 0 su > operatoriumi.) Žr. Šio kodo išvestis:

 9 8 7 6 5 4 3 2 1 0 

Dabar mes pirmą kartą lyginame ir tada sumažiname, matydami 0 išvestyje.

Jei norime pirmiausia sumažinti ir palyginti, naudokite šį kodą:

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

Ši išvada:

 9 8 7 6 5 4 3 2 1 
206
18 нояб. Atsakymą pateikė Sajad Bahmani lapkričio 18 d 2009-11-18 15:52 '09 15:52 2009-11-18 15:52

Mano kompiliatorius spausdins 9876543210, kai paleisite šį kodą.

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

Kaip tikėtasi. Vertė while( x-- > 0 ) reiškia, while( x > 0) . x-- įrašyti x-- x .

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

- Tai dar vienas būdas rašyti tą patį.

Malonu, kad originalas atrodo kaip „o x eina į 0“.

160
17 янв. atsakymas pateiktas cool_me5000 17 jan. 2010-01-17 03:46 '10, 3:46, 2010-01-17 03:46

Tarp tarp -- ir > nėra tarpo. x pranešimas sumažinamas, t.y. sumažėja patikrinus būseną x>0 ? .

133
atsakymas pateikiamas p. 28 дек. X 28 d 2009-12-28 19:32 '10, 19:32, 2009-12-28 19:32

-- - operatoriaus sumažinimas ir > - operatorius daugiau .

Du operatoriai yra naudojami kaip vienas, pavyzdžiui --> .

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

Tai dviejų operatorių derinys. Pirmiausia siekiama sumažinti vertę, ir > patikrinti, ar vertė yra didesnė už tinkamą operandą.

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

Rezultatai bus:

 9 8 7 6 5 4 3 2 1 0 
117
02 апр. Rajeev Das atsakymas, balandžio 2 d. 2013-04-02 14:22 '13, 14:22 pm 2013-04-02 14:22

Tiesą sakant, x sumažintas ir ši sąlyga yra patikrinta. Tai nėra --> , ji (x--) > 0

Pastaba: x vertė pasikeičia po to, kai patikrinama būklė, nes ji yra sumažinta. Kai kurie panašūs atvejai gali įvykti, pavyzdžiui:

 --> x-->0 ++> x++>0 -->= x-->=0 ++>= x++>=0 
112
18 авг. Atsakymą pateikia „ AndroidLearner“ 18 rug. 2012-08-18 10:34 '12 10:34 am 2012-08-18 10:34

C ir C ++ laikosi „maksimalaus munch“ taisyklės. Lygiai taip pat, kaip --- b yra išverstas į (a--) - b , jūsų atveju x-->0 išverstas į (x--)>0 .

Ši taisyklė iš esmės sako, kad judėjimas iš kairės į dešinę, išraiškos yra suformuotos priimant maksimalų simbolių skaičių, kurie sudarys teisingą išraišką.

105
10 февр. Atsakymą pateikė Pandrei 10 vasaris. 2014-02-10 20:29 '14, 20:29, 2014-02-10 20:29

Kodėl visos komplikacijos?

Paprastas atsakymas į pradinį klausimą:

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

Ar tas pats. Nesakydamas, kad turėtumėte tai padaryti, bet jis daro tą patį ir atsakytų į vieną klausimą.

x-- yra tik pirmiau minėtas x-- , ir > yra tiesiog normalesnis nei x-- operator . Nėra didelių paslapčių!

Šiuo metu yra per daug žmonių, kurie daro paprastus dalykus;)

23
27 окт. Atsakymas suteikiamas Garry_G 27 spalis. 2016-10-27 18:09 '16 at 18:09 2016-10-27 18:09

Paprastai mes apibrėžiame sąlygą „ () “ kilpos skliausteliuose ir nutraukimo sąlygose garbanų skliausteliuose „ {} “, bet tai ir > yra tai, kaip kiekvienas iš karto apibrėžia viską. Pavyzdžiui, pavyzdžiui:

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

Jis sako, sumažina ir pradeda ciklą, kol laikas a didesnis nei 0

Kitas būdas, kuriuo jis turėjo būti:

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

abiem kryptimis mes darome tą patį ir pasiekiame tuos pačius tikslus.

20
28 мая '17 в 23:10 2017-05-28 23:10 atsakymas pateikiamas Zohaib Ejaz gegužės 28, 17 d. 23:10

C / C ++ ignoruoja erdves su sąlyga. Iš esmės kodas

 while (x --> 0) 

tai yra tas pats, kas

 while (x-- > 0) 

arba

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

Naudojant post-decrement būklę. Leiskite pasakyti x = 10 . Sąlygos operatorius bus 10>0 ir printf("%d ", x); linijos operatorius pirmuoju etapu suteiks 9 . Antrą kartą, sąlyga bus 9>0 o antspaudas bus lygus 8 ir tol, kol bus įvykdyta 0>0 .

0
06 сент. atsakymas pateikiamas Zirc 06 sep. 2018-09-06 00:20 '18 prie 0:20 2018-09-06 00:20

--> iš esmės yra tas pats, kas:

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

rasite visus skaičius tarp x ir nurodyto skaičiaus.

-1
Alekso atsakymas . 14 апр. S. Bal. 14 2018-04-14 21:59 '18, 09:59 pm 2018-14-14 21:59

Jei teko parašyti funkciją, kad atliktumėte atvirkštinę funkciją, sintaksė yra daug aiškesnė, jau nekalbant apie tai, kad aš nemanau, kad jį matė anksčiau:

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

Rezultatas:

11 12 13 14 15 16 17 18 19 20

-1
13 июля '18 в 18:34 2018-07-13 18:34 TrevorLee atsakė į liepos 18 d. 18 val. 18:34 val

Iš tikrųjų → ne vienas operatorius. Tai yra dviejų atskirų operatorių - ir> derinys

Paimkime pavyzdį. Nors (x → 0) Tai viena konfidenciali išraiška su vienu patvirtinimu. Čia pirmasis x yra jo vertės sumažėjimas, o tada lyginamas su 0.

-4
06 дек. Lovekush Vishwakarma atsakymas gruodžio 06 d 2017-12-06 16:45 '17, 16:45 pm 2017-12-06 16:45

Kiti klausimai apie žymes arba Užduoti klausimą