[c++] Что такое оператор «->» в C ++?


Answers

Или для чего-то совершенно другого ... x слайдов до 0

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

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

Question

Прочитав Hidden Features и Dark Corners из 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. Где это определено в стандарте и откуда оно взялось?




Мой компилятор распечатает 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 is to 0».




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

while (x-- > 0)



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

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




Это

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

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

       printf("%d ", x);
     }

     return 0;
}

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




while( x-- > 0 )

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




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

Простой ответ на исходный вопрос:

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

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

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

Слишком много людей усложняют сложные вещи в наши дни;)




Полностью выродка, но я буду использовать это:

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



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

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

-->    x-->0
++>    x++>0
-->=   x-->=0
++>=   x++>=0



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

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






Related