Вопрос

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

Это было полезно?

Решение

- > не является оператором. Фактически это два отдельных оператора: - и > .

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

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

while( (x--) > 0 )

Другие советы

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

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

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

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

Не говоря уже о шутках, это два разных оператора: - и > , описанные соответственно в & # 167; 5.2.6 / 2 и & # 167; 5.9 из Стандарт C ++ 03.

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

while (x-- > 0)

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

while(x > 0) {
    x = x-1;
    // logic
}

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

;)

Его

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

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

       printf("%d ", x);
     }

     return 0;
}

Только пространство делает вещи забавными, -- декременты и > сравнивает.

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

while( x-- > 0 )

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

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

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

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

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

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

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

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

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

Этот код сначала сравнивает 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

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

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

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

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

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

#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            

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

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

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

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

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

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

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

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

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

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

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

Традиционным образом мы определяем условие в круглых скобках while () и завершающее условие внутри фигурных скобок {} , но - > определяет оба сразу.

Например:

int abc(void)
{
    int a = 5
    while((a--) > 0) // Decrement and comparison both at once
    {
        // Code
    }
}

Это уменьшает a и запускает цикл, пока a больше 0 .

Условно это будет выглядеть так:

int abc(void)
{
    int a = 5;
    while(a > 0)
    {
        a--;
        // Code
    }
    a--;
}

В обоих случаях мы делаем одно и то же и достигаем одинаковых целей.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top