Што такое аператар "->" у З ++?

Пасля прачытання Hidden Features і Dark Corners of З ++ / STL на comp.> , я быў цалкам здзіўлены, што наступны фрагмент, скампіляваны і працуе ў як Visual Studio 2008, гэтак і g ++ 4.4.

Тут код:

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

Я б выказаў здагадку, што гэта C, так як ён працуе і ў GCC. Дзе гэта вызначана ў стандарце і адкуль яно ўзялося?

8054
29 окт. зададзены GManNickG 29 каст. 2009-10-29 09:57 '09 года ў 9:57 2009-10-29 09:57
@ 25 адказаў

--> не з'яўляецца аператарам. На самой справе гэта два асобных аператара, -- і > .

Умоўны код памяншае значэнне x , вяртаючы зыходнае (не паменшанае) значэнне x , а затым параўноўвае зыходнае значэнне з 0 з дапамогай аператара > .

Каб лепш зразумець, выраз можа быць напісана наступным чынам:

 while( (x--) > 0 ) 
7743
29 окт. адказ дадзены Charles Salvia 29 каст. 2009-10-29 10:00 '09 а 10:00 2009-10-29 10:00

Або для чагосьці зусім іншага ... х слізгае да 0

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

Не так математично, але ... кожная карціна малюе тысячу слоў ...

2564
18 янв. адказ дадзены unsynchronized 18 студз. 2012-01-18 14:18 '12 у 14:18 2012-01-18 14:18

Гэта вельмі складаны аператар, таму нават ISO / IEC JTC1 (Joint Technical Committee 1) размясціў сваё апісанне ў двух розных частках З ++ Стандартны.

Жартам у бок, гэта два розных аператара: -- і > , апісаныя адпаведна ў раздзеле 5.2.6 / 2 і ў раздзеле 5.9 стандарту З ++ 03.

2265
29 окт. адказ дадзены Kirill V. Lyadvinsky 29 каст. 2009-10-29 11:38 '09 у 11:38 2009-10-29 11:38

гэта эквівалентна

 while (x-- > 0) 

x-- (пасля декремента) эквівалентна x = x-1 таму код пераўтворыцца ў:

 while(x > 0) { x = x-1; // logic } 
1183
29 окт. адказ дадзены Jay Riggs 29 каст. 2009-10-29 10:00 '09 а 10:00 2009-10-29 10:00

x можа ісці да нуля яшчэ хутчэй у зваротным кірунку:

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

8 6 4 2

Вы можаце кіраваць хуткасцю са стрэлкай!

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

90 80 70 60 50 40 30 20 10

;)

961
28 дек. адказ дадзены doc 28 снеж. 2014-12-28 03:32 '14 у 03:32 2014/12/28 03:32

гэта

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

Проста прастору робіць рэчы пацешнымі, -- памяншаецца і > параўноўваецца.

513
29 окт. адказ дадзены RageZ 29 каст. 2009-10-29 10:00 '09 а 10:00 2009-10-29 10:00

Выкарыстанне --> мае гістарычную значнасць. Decrementing быў (і па-ранейшаму ў некаторых выпадках), хутчэй, чым прырашчэнне архітэктуры x86. Выкарыстоўваючы --> , выкажам здагадку, што x падыходзіць да 0 і звяртаецца да тых, у каго ёсць матэматычны фон.

380
18 нояб. адказ дадзены Matt Joiner 18 лістапада. 2009-11-18 15:47 '09 у 15:47 2009-11-18 15:47
 while( x-- > 0 ) 

як гэта аналізуецца.

332
29 окт. адказ дадзены Grumdrig 29 каст. 2009-10-29 10:00 '09 а 10:00 2009-10-29 10:00

Цалкам вылюдка, але я буду выкарыстоўваць гэта:

 #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 адказ дадзены Escualo 18 мая '10 у 23:33 2010-05-18 23:33

Адна кніга, якую я прачытаў (я не памятаю, правільна, якую кнігу) заявіў: Кампілятары спрабуюць разабраць выразы на самы вялікі токен, выкарыстоўваючы правіла left right.

У гэтым выпадку выраз:

 x-->0 

Парсы для самых вялікіх токенаў:

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

Тое ж правіла прымяняецца да гэтага выразу:

 a-----b 

Пасля сінтаксічнага аналізу:

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

Спадзяюся, гэта дапаможа зразумець складанае выраз ^^

291
09 апр. адказ дадзены NguyenDat 09 крас. 2010-04-09 03:04 '10 у 03:04 2010-04-09 03:04

Гэта сапраўды гэтак жа, як

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

для неадмо ¢ ных лікаў

246
31 дек. адказ дадзены Good Person 31 снеж. 2009-12-31 16:48 '10 у 16:48 2009-12-31 16:48

У любым выпадку ў нас зараз ёсць аператар "ідзе". "-->" лёгка запомніць як кірунак, а "while x звяртаецца ў нуль" азначае "прамалінейна".

Акрамя таго, ён крыху больш эфектыўна, чым "for (x = 10; x > 0; x --)" на некаторых платформах.

224
29 окт. адказ дадзены Test 29 каст. 2009-10-29 17:45 '09 у 17:45 2009-10-29 17:45

Гэты код спачатку параўноўвае x і 0, а затым памяншае x. (Таксама сказана ў першым адказе: вы пост-декрементируете x, а затым параўноўваеце x і 0 з аператарам > .) Глядзі. Выснова гэтага кода:

 9 8 7 6 5 4 3 2 1 0 

Цяпер мы спачатку параўноўваем, а затым памяншаем, бачачы 0 на выхадзе.

Калі мы хочам спачатку паменшыць, а затым параўнаць, выкарыстоўвайце гэты код:

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

Гэтая выснова:

 9 8 7 6 5 4 3 2 1 
206
18 нояб. адказ дадзены Sajad Bahmani 18 лістапада. 2009-11-18 15:52 '09 у 15:52 2009-11-18 15:52

Мой кампілятар раздрукуюць 9876543210 пры запуску гэтага кода.

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

Як і чакалася. Значэнне while( x-- > 0 ) азначае while( x > 0) . x-- пост декременты x .

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

- гэта іншы спосаб напісаць адно і тое ж.

Прыемна, што арыгінал выглядае як "while x пераходзіць у 0".

160
17 янв. адказ дадзены cool_me5000 17 студз. 2010-01-17 03:46 '10 у 3:46 2010-01-17 03:46

Паміж -- і > прабел адсутнічае. x пост декрементируется, г.зн. памяншаецца пасля праверкі ўмовы x>0 ? .

133
адказ дадзены Mr. 28 дек. X 28 снеж. 2009-12-28 19:32 '10 у 19:32 2009-12-28 19:32

-- - аператар декремент, а > - аператар больш.

Два аператара прымяняюцца як адзін, напрыклад --> .

124
06 апр. адказ дадзены sam 06 крас. 2010-04-06 13:45 '10 у 13:45 2010-04-06 13:45

Гэта камбінацыя двух аператараў. Першы -- прызначаны для памяншэння значэння, а > - для праверкі таго, ці больш значэнне, чым правы аперанд.

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

Выхад будзе:

 9 8 7 6 5 4 3 2 1 0 
117
02 апр. адказ дадзены Rajeev Das 02 крас. 2013-04-02 14:22 '13 у 14:22 2013/04/02 14:22

Фактычна, x пост-декрементируется і правяраецца гэтую ўмову. Гэта не --> , it (x--) > 0

Заўвага: значэнне x змяняецца пасля праверкі ўмовы, паколькі яно пост-декрементируется. Некаторыя аналагічныя выпадкі таксама могуць мець месца, напрыклад:

 --> x-->0 ++> x++>0 -->= x-->=0 ++>= x++>=0 
112
18 авг. адказ дадзены AndroidLearner 18 жнів. 2012-08-18 10:34 '12 у 10:34 2012/08/18 10:34

C і C ++ падпарадкоўваюцца правілу "максімум munch". Сапраўды гэтак жа, як --- b перакладаецца на (a--) - b , у вашым выпадку x-->0 перакладаецца на (x--)>0 .

Тое, што правіла абвяшчае па сутнасці, складаецца ў тым, што рух злева направа, выразы фармуюцца шляхам прыняцця максімуму сімвалаў, якія будуць фарміраваць правільнае выраз.

105
10 февр. адказ дадзены Pandrei 10 февр. 2014-02-10 20:29 '14 у 20:29 2014/02/10 20:29

Чаму ўсё ўскладненні?

Просты адказ на зыходны пытанне:

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

Робіць тое ж самае. Не кажучы, што вы павінны рабіць гэта так, але ён робіць тое ж самае і адказаў бы на адно пытанне.

x-- з'яўляецца толькі скарачэннем для вышэй, а > з'яўляецца проста нармальным больш x-- operator . Няма вялікай таямніцы!

Там занадта шмат людзей, якія робяць простыя рэчы складанымі ў цяперашні час;)

23
27 окт. адказ дадзены Garry_G 27 каст. 2016-10-27 18:09 '16 у 18:09 2016/10/27 18:09

У звычайным спосабе мы вызначаем ўмова ў дужках цыклу " () " і ўмова завяршэння ўнутры фігурных дужак " {} ", але гэта -- і > - гэта спосаб, якім кожны вызначае ўсе адразу. Напрыклад, напрыклад:

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

Ён кажа, памяншае a і запускае цыкл да таго часу, пакуль час a больш, чым 0

Іншым спосабам гэта павінна было быць:

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

у абодвух напрамках, мы робім тое ж самае і дасягаем тых жа мэтаў.

20
28 мая '17 в 23:10 2017-05-28 23:10 адказ дадзены Zohaib Ejaz 28 мая '17 а 23:10 2017/05/28 23:10

C / C ++ ігнаруе прабелы з умовай. Па сутнасці, код

 while (x --> 0) 

гэта тое ж самае, што і

 while (x-- > 0) 

або

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

Выкарыстоўваючы пост-декремент ва ўмове. Няхай гавораць x = 10 . Аператар ўмовы будзе роўны 10>0 і printf("%d ", x); аператар у цыкле дасць 9 ў першым прагоне. Для другога запуску ўмова будзе 9>0 а друк будзе роўная 8 і гэтак далей да ўмовы 0>0 .

0
06 сент. адказ дадзены Zirc 06 сент. 2018-09-06 00:20 '18 у 0:20 2018/09/06 00:20

--> - гэта ў асноўным тое ж самае, што:

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

вы знаходзіце ўсе лікі паміж x і зададзеным лікам.

-1
адказ дадзены Aleks. 14 апр. S. 14 крас. 2018-04-14 21:59 '18 а 21:59 2018/04/14 21:59

Калі вы павінны былі напісаць функцыю, каб зрабіць зваротны, сінтаксіс значна больш відавочны, не кажучы ўжо пра тое, што я не думаю, што бачыў яго раней:

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

Вынік:

11 12 13 14 15 16 17 18 19 20

-1
13 июля '18 в 18:34 2018-07-13 18:34 адказ дадзены TrevorLee 13 ліпеня '18 ў 18:34 2018/07/13 18:34

На самай справе → не адзін аператар. Гэта камбінацыя двух асобных аператараў - і>

Давайце разгледзім прыклад. У той час як (х → 0) Гэта адно канфідэнцыйнае выраз з адным пацвярджэннем. Тут першы x з'яўляецца декрементом з яго значэннем, а затым параўноўваецца з 0.

-4
06 дек. адказ дадзены Lovekush Vishwakarma 06 снеж. 2017-12-06 16:45 '17 у 16:45 2017/12/06 16:45

Іншыя пытанні па пазнаках або Задайце пытанне