Оператор рекурсии и предварительного декремента

У меня есть эта функция:

void m(int n)
{
if(n > 0)
m(--n);
cout << n << " "; //for n = 5 --> output is: 0 0 1 2 3 4
}

У меня проблема с пониманием того, как это работает.
Например:

n (вход) = 5

выход: 0 0 1 2 3 4

Мой вопрос: Почему он показывает ноль дважды?

Когда я добавляю скобки, как это:

void m(int n)
{
if(n > 0)
{
m(--n);
cout << n << " "; // now, it shows 0 1 2 3 4 (n = 5)
}
}

Итак, какие скобки вызывают в этом коде, что «0» существует только один раз?

И когда я изменяю пре-декремент (—n) на пост-декремент (n—), это ничего не показывает. Зачем?

Может ли кто-нибудь помочь мне понять, как это работает?

4

Решение

Первое, что нужно отметить: в C ++, если вы не ставите скобки после if заявление, только следующая строка будет в заявлении.

Пример :

if(x > 0)
cout << 1;
cout << 2;

Вот cout << 2 всегда будет выполняться независимо от значения х

Правильный способ написания этого

if(x > 0)
{
cout << 1;
cout << 2;
}

То же самое касается else заявления
Так что это было для скобок.

Мое дикое предположение для почтового декремента следующее:
если вы делаете m(n--), переданное значение будет 5, значение n будет меняться только после вызова функции и выйти за рамки (так что это не имеет значения). Так что произойдет бесконечное количество m (5) вызовов, и поэтому ничего не появляется. (Я не уверен насчет этой части, поэтому, пожалуйста, скажите мне, если не так)!

Надеюсь, это помогло!

7

Другие решения

Похоже, вы перепутали с синтаксисом Python, где if определяется отступом. В C (и C ++, C #, Java и многих других языках) область действия — это одно утверждение (которое заканчивается ;) если вы не используете фигурные скобки { а также }, В 1-м варианте вашего кода cout << n << ... будет выполняться всегда, независимо от значения n, Во втором варианте это будет выполнено только if(n > 0)

4

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector