Как ((a++,b)) работает?

В приведенном выше блоке кода, я пытаюсь понять, как строка return reverse((i++, i)) работает.

#include <stdio.h>
        void reverse(int i);
        int main()
        {
            reverse(1);
        }
        void reverse(int i)
        {
            if (i > 5)
                return ;
            printf("%d ", i);
    //        return reverse(i++); -- stack overflow
            return reverse((i++, i));
        }

Я также нашел следующий фрагмент кода, который работает аналогично.

#include <stdio.h>
    int main()
    {
        int y = 1, x = 0;
        int l = (y++, x++) ? y : x;
        printf("%d\n", l);
    }

Прошу прощения, если вопрос очень простой. Мне было очень трудно это понять. Если кто-то может объяснить, это будет полезно.

1 ответ

Решение

В вашем первом коде

  • Случай 1:

    return reverse(i++);
    

    вызовет переполнение стека как значение без изменений i будет использоваться в качестве аргумента функции (так как эффект последующего приращения будет секвенироваться после вызова функции), а затем i будет увеличено. Итак, это в основном вызывает reverse() с неизменным аргументом и приведет к бесконечной рекурсии.

  • Случай 2:

    Ото,

    return reverse((i++, i));
    

    является магическим оператором запятой, который в основном оценивает левое выражение, отбрасывает значение и, наконец, возвращает (т. е. результат использования оператора запятой) тип и значение вычисления выражения правой части. Итак, обновленное значение i будет использоваться в качестве аргумента функции.

    Это эквивалентно написанию

    return reverse(++i);    //pre-inrement
    

    где обновленное значение i будет использоваться.


Во втором коде

  int l = (y++, x++) ? y : x;

оценивается в следующем порядке

  • y++ оценивается, результат игнорируется. y увеличивается
  • x++ оценивается, результат рассматривается для троичного оператора. Это ЛОЖЬ. (Помните, пост увеличение). Затем, x увеличивается (постинкремент).
  • Согласно правилу троичного оператора, если первый операнд (выражение) - ЛОЖЬ (оценивается как 0), то третье (операнд) выражение будет оценено, и значение будет возвращено.
  • Возвращает увеличенное значение x храниться в l, который 1,
Другие вопросы по тегам