2015-05-15 10 views
2

У меня следующий пример кода, где я использовал предварительно декрементРазница между до и после декремента в рекурсивной функции аргумента

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

Не могли бы вы объяснить мне подробно, почему это происходит?

+0

Это происходит потому, что будет вызвана функция (c--) с тем же значением c и при завершении c будет уменьшаться. Но поскольку он рекурсивно называется, следовательно, он будет вызываться с одинаковым значением без каких-либо шансов на возврат, и в итоге вы столкнетесь с ошибкой переполнения стека. –

+0

Можете ли вы объяснить мне, как работают pre и post? –

+1

Предположим, что int x = 1, y = 0; Теперь y = x ++ приведет к y == 1 и x == 2. Но если вы выполняете y = ++ x, тогда bot x и y будут равны 2. –

ответ

4

Это происходит потому, что функция (c--) будет вызываться с тем же значением c, а при завершении c будет уменьшена. Но поскольку он рекурсивно называется, следовательно, он будет вызываться с одинаковым значением без каких-либо шансов на возврат, и в итоге вы столкнетесь с ошибкой переполнения стека.

Предположим, что int x = 1, y = 0; Теперь y = x ++ приведет к y == 1 и x == 2. Но если вы выполняете y = ++ x, тогда bot x и y будут равны 2.

5

Поскольку --c вернется c-1, однако c-- возвращение c .so при использовании 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; 
+0

1+ для быстрого и подробного объяснения –

1

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

функция (c--), сначала вызывающая функция (c) позже декремент c-- произойдет.

+0

1+ для быстрого и подробного объяснения –