Что такое оператор "->" в C ++? - PullRequest
8357 голосов
/ 29 октября 2009

Прочитав Скрытые функции и темные углы 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. Где это определено в стандарте и откуда оно взято?

Ответы [ 21 ]

8037 голосов
/ 29 октября 2009

--> не является оператором. На самом деле это два отдельных оператора, -- и >.

Код условия уменьшает x, возвращая исходное (не уменьшенное) значение x, а затем сравнивает исходное значение с 0, используя оператор >.

Чтобы лучше понять, утверждение можно записать следующим образом:

while( (x--) > 0 )
2775 голосов
/ 18 января 2012

Или для чего-то совершенно другого ... х скользит к 0

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

Не так математично, но ... каждая картина рисует тысячу слов ...

2302 голосов
/ 29 октября 2009

Это очень сложный оператор, поэтому даже ISO / IEC JTC1 (Объединенный технический комитет 1) поместил свое описание в две разные части стандарта C ++.

Если не считать шутки, это два разных оператора: -- и >, описанные соответственно в разделах 5.2.6 / 2 и 5.9 стандарта C ++ 03.

1219 голосов
/ 29 октября 2009

Это эквивалентно

while (x-- > 0)

x-- (после декремента) эквивалентно x = x-1, поэтому код преобразуется в:

while(x > 0) {
    x = x-1;
    // logic
}
1050 голосов
/ 28 декабря 2014

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

;)

528 голосов
/ 29 октября 2009

Это

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

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

       printf("%d ", x);
     }

     return 0;
}

Пространство делает вещи смешными, -- уменьшает и > сравнивает.

399 голосов
/ 18 ноября 2009

Использование --> имеет историческое значение. Уменьшение было (и остается в некоторых случаях) быстрее, чем увеличение в архитектуре x86. Использование --> предполагает, что x будет 0, и привлекает тех, кто имеет математическое образование

345 голосов
/ 29 октября 2009
while( x-- > 0 )

как это анализируется.

333 голосов
/ 19 мая 2010

Совершенно отвратительный, но я буду использовать это:

#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;
}
304 голосов
/ 09 апреля 2010

В одной книге, которую я прочитал (я не помню, какая именно книга), указано: Компиляторы пытаются анализировать выражения по наибольшему токену , используя левое правое правило.

В этом случае выражение:

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

Надеюсь, это поможет понять сложное выражение ^^

...