У меня есть следующий пример кода, где я использовал предварительный декремент
void function(int c)
{
if(c == 0)
{
return;
}
else
{
cout << "DP" << c << endl;
function(--c);
cout << c << endl;
return;
}
}
Эта функция дает выход для входа 4 в виде:
DP3
DP2
DP1
DP0
0
1
2
3
Но когда я использую пост декремент
void function(int c)
{
if(c == 0)
{
return;
}
else
{
cout << "DP" << c << endl;
function(c--);
cout << c << endl;
return;
}
}
Выход идет в бесконечном цикле с DP4
Можете ли вы объяснить мне подробно, почему это происходит?
Это происходит потому, что функция (c—) будет вызываться с тем же значением c, а когда она завершится, c будет уменьшен. Но так как он вызывается рекурсивно, следовательно, он будет вызываться с тем же значением без возможности возврата, и в итоге вы столкнетесь с ошибкой переполнения стека.
Предположим, что int x = 1, y = 0; Теперь y = x ++ приведет к y == 1 и x == 2. Но если вы сделаете y = ++ x, тогда бот x и y будет равен 2.
Так как --c
вернусь c-1
,тем не мение c--
вернуть c
.Так когда вы используете function(c--)
равно function(c);c = c-1;
,c
никогда не будет 0
Так что функция не остановится.
Чтобы узнать разницу между --x
а также x--
Вы можете попробовать следующий код:
int x = 5,y=5;
cout<<x--<<endl;
cout<<--y<<endl;
cout<<x<<" "<<y<<endl;
В случае, если значение после декремента будет передано перед декрементом, всегда одинаковое значение будет передано в функцию, оно никогда не выйдет.
функция (c—), сначала она вызывает функцию (c), позже произойдет декремент c—.