Що таке оператор "->" в С ++?

Після прочитання 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 9: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 о 3:32 2014-12-28 3: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 в 3:04 2010-04-09 3: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 3: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

Інші питання по мітках або Задайте питання