Питання Що таке оператор "->" в C ++?


Після прочитання Приховані можливості та темні куточки C ++ / STL на comp.lang.c++.moderated, Я був абсолютно здивований тим, що наступний фрагмент складався і працював у 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. Де це визначено в стандарті, і звідки він прийшов?


7782


походження


Або просто відповідний інтервал ... Я не думаю, що я коли-небудь бачив пробіл між змінною та і ++ або -- раніше ... - Matthew Scharley
Цей "перехід до" оператора можна повернути (0 <- x). І також є оператор "run to" (0 <---- x). Гіз, найцікавіше, про що я колись чув про синтаксис C + + +1 для запитання. - SadSido
Досить приємно, хоча інтерпретація дуже неправильна, він описує те, що код правильно працює. :) - Noldorin
Уявіть нові можливості синтаксису: #define upto ++<, #define downto -->. Якщо ти відчуваєш зло, то можеш це зробити #define for while( і #define do ) { (і #define done ;}) і напиши for x downto 0 do printf("%d\n", x) done О, людство ... - Chris Lutz
Відкриває можливість створення абсолютно нового експресивного способу кодування, який варто жертвувати кількома попередженнями компілятора для: bool CheckNegative (int x) {return x <0? правда :-( невірно); } - ttt


Відповіді:


--> не є оператором. Фактично це два окремих оператори, -- і >.

Код умовного коду зменшується x, при поверненні xоригінальне (не декрементоване) значення, а потім порівнює початкове значення з 0 використовуючи > оператор

Для кращого розуміння твердження можна записати таким чином:

while( (x--) > 0 )

7479



Знову ж таки, це виглядає як якийсь оператор діапазону в цьому контексті. - Charles Salvia
Говорячи про те, що х пост-декрементований, а потім порівнюється з 0, то ж саме каже, що x зменшується після порівняння з 0 - Charles Salvia
У Java він також компілює :) - Steven Devijver
Ім'я для нього, @Jay, - поганий стиль програмування :-) Це підтверджується тим фактом, що питання було поставлено на перше місце. Набагато більше сенсу текстуально пов'язувати оператори з тим, на що вони працюють, а не з чимось незв'язаним, тому while (x-- > 0)буде більш придатним. Це також робить все більш очевидним те, що відбувається (принаймні в редакторі фіксованого шрифту), що означає, що дужки в цьому відповіді не будуть необхідними. - paxdiablo
Тому для пояснення "->" оператора ви повинні використовувати "((" оператор "і" - "> оператор? - Ira Baxter


Або для чогось зовсім іншого ... x ковзає до 0

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

Не настільки математично, але ... кожна картина малює тисячу слів. ...


2382



На жаль, я цього не отримую. Як це працює? - mafu
@mafutrct - Як я пам'ятаю, \ in C просто додає наступний рядок, як ніби не було переривання рядка. Тут в основному нічого не роблять. - Hogan
IIRC, K & R C дозволило пробіл між "-'-іми в операторі декремента, в цьому випадку ви могли б мати зворотні косу риску в середині його, що виглядатиме навіть крутішим. :) - Jules
@ArnavBorborah це старе значення why waste words when a picture does a better job , використовується як жарт у цьому контексті. (фактично є 2 ключові слова while і printf ) - unsynchronized
Ага так, неясний оператор слайдів. Як я можу забути! - demonkoryu


Це дуже складний оператор, так що навіть ISO / IEC JTC1 (Об'єднаний технічний комітет 1) розмістив його опис у двох різних частинах стандарту C ++.

Жартуючи в сторону, вони є двома різними операторами: -- і > описані, відповідно, в §5.2.6 / 2 та §5.9 стандарту C ++ 03.


2221





Це еквівалентно

while (x-- > 0)

1142



Хоча це може допомогти багатьом зрозуміти код, деякі рядки, щоб пояснити це належним чином, будуть корисними. - Dukeling
@Dukeling x-- коротка ручна позначка для x-1 - Albert Renshaw
@AlbertRenshaw Я впевнений, що ріковий коментар, на який ви відповіли, мав на увазі, що пояснення не було єдиним оператором, а скоріше, двом операторам, які були поміщені в сум'яття, було б корисним. - mah
@ mbomb007 Вибач, я мав на увазі сказати x- = 1 - пізніше було хаха - Albert Renshaw
@ АllbertRenshaw але x -= 1 і x-- не є однаковими ... Якщо ви хочете написати так, то це повинно бути while (x >= 0) { x -= 1; } - Krzysztof Karski


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

;)


861



яка операційна система, цей тип виходу генерується, я використовую Ubuntu 12.04 в тому, що у мене з'явилося повідомлення про помилку - Bhuvanesh
Хоча це повинно бути очевидним, всім новим користувачам С ++ читайте це: не робіть цього. Просто скористайтеся покращеним завданням, якщо вам потрібно збільшити / зменшити більше, ніж один. - Blimeo
Нуль з "лазерами". while (0> - - - - - - - - - - ---------- x) ... той же висновок. - Samuel Danielson
@phord ви впевнені, що не складаються? -> coliru.stacked-crooked.com/a/5aa89a65e3a86c98 - doc
@doc Він компілює в c ++, але не в c. - phord


Його

#include <stdio.h>
int main(void){
     int x = 10;

     while( x-- > 0 ){ // x goes to 0

       printf("%d ", x);
     }

     return 0;
}

Просто простір робить речі виглядають смішно, -- декреми і > порівнює


498





Використання --> має історичну актуальність. Зменшення значення було (і в деяких випадках), швидше, ніж збільшення архітектури x86. Використовуючи --> пропонує це x збирається 0, і звертається до тих, хто має математичний досвід.


372



Не зовсім так. Зниження та збільшення призводять до тієї ж кількості часу, користь від цього полягає в тому, що порівняння з нулем дуже швидко порівняно з порівнянням порівняно з змінною. Це вірно для багатьох архітектур, а не тільки для x86. Що-небудь з інструкцією JZ (стрибок, якщо нуль). Натискаючи навколо вас, ви можете знайти багато "для" циклів, написаних назад, щоб зберегти цикли порівняння. Це особливо швидко відбувається на x86, оскільки акт зменшення змінної встановлює відповідний нульовий прапорець, тому ви могли б філію без необхідності явно порівнювати змінну. - burito
Ну, декремент до нуля означає, що вам доводиться порівнювати проти 0 ітерації за цикл, а повторення до n означає порівняння з кожною ітерацією n. Перший прагне бути простішим (і в деяких архітектурах, автоматично перевіряється після кожної операції реєстрації даних). - Joey Adams
@burrito Хоча я і не погоджуюсь, цикли, обумовлені ненульовими значеннями, загалом передбачаються майже повністю. - Duncan
Приріст і декремент однаково швидкі, ймовірно, на всіх платформах (напевно на x86). Різниця полягає у тестуванні стану завершення петлі. Щоб побачити, чи лічильник досяг нуля, практично немає вільного - коли ви зменшуєте значення, у процесорі встановлюється нульовий прапорець і для виявлення кінцевого стану, який ви просто повинні перевірити, що прапорець тим самим, коли ви збільшуєте операцію порівняння, потрібна перед кінцевим станом може бути виявлено. - lego
Звичайно, усе це є актуальним в наші дні, оскільки сучасні компілятори можуть автоматично векторизувати і перекручувати цикли. - Lambda Fairy


while( x-- > 0 )

це те, як це проаналізовано.


324





Зовсім гавкаю, але я буду використовувати це:

#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;
}

292



Я сподіваюсь, що я ніколи не стикаюсь з будь-яким з ваших вихідних кодів - mk12
@ Mk12 Це не вихідний код ... це ієрогліфи :-) - raffian
@SAFX - Це було б зовсім ієрогліфічно єгипетські дужки - mouviciel
Це не складається. С не Паскаль, де знаходиться інтер'єр Росії do ... while це список заяв. У C це блок, тому це повинно бути do { ... } while. - user207421
@EJP він складається. Синтаксис є do statement while ( expression ) ;. Сказавши це, я сподіваюсь, це зрозуміло, я мав на увазі приклад як жарт. - Escualo