Что такое оператор "->" в 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 ]

253 голосов
/ 31 декабря 2009

Это точно так же, как

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

для неотрицательных чисел

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

В любом случае, у нас теперь есть оператор "идет". "-->" легко запомнить как направление, а «пока x стремится к нулю» означает прямое значение.

Кроме того, на некоторых платформах он немного эффективнее, чем "for (x = 10; x > 0; x --)".

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

Этот код сначала сравнивает 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
167 голосов
/ 17 января 2010

Мой компилятор распечатает 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;
}

- это другой способ написания одного и того же.

Приятно, что оригинал выглядит как "пока x идет в 0".

138 голосов
/ 28 декабря 2009

Между -- и > отсутствует пробел. x пост-декрементировано, то есть декрементировано после проверки условия x>0 ?.

129 голосов
/ 06 апреля 2010

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

Два оператора применяются как один, например -->.

123 голосов
/ 02 апреля 2013

Это комбинация двух операторов. Сначала -- - для уменьшения значения, а > - для проверки, больше ли значение правого операнда.

#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 голосов
/ 18 августа 2012

На самом деле, x является пост-декрементом и с этим условием проверяется. Это не -->, это (x--) > 0

Примечание: значение x изменяется после проверки условия, потому что оно после уменьшения. Также возможны некоторые похожие случаи, например:

-->    x-->0
++>    x++>0
-->=   x-->=0
++>=   x++>=0
113 голосов
/ 10 февраля 2014

C и C ++ подчиняются правилу "максимальное жевание". Точно так же a --- b переводится в (a--) - b, в вашем случае x-->0 переводится в (x--)>0.

По сути, правило гласит, что при движении слева направо выражения формируются путем взятия максимального количества символов, которые образуют правильное выражение.

26 голосов
/ 27 октября 2016

Почему все осложнения?

Простой ответ на оригинальный вопрос:

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

делает то же самое. Я не говорю, что вы должны делать это так, но он делает то же самое и ответил бы на вопрос в одном посте.

x-- - это просто сокращение для вышеупомянутого, а > - это обычно больше, чем operator. Нет большой загадки!

В наши дни слишком много людей делают простые вещи сложными;)

...