Почему --x;работа и x-- дает ошибку сегмента в коде рекурсии - PullRequest
3 голосов
/ 13 января 2012

Этот код дает мне ошибку сегмента, но когда я изменяю x-- на --x, он печатается правильно.

Разве они не одинаковые ????

int main()
{    
    myFunc(5); 
    return 0;
}

void myFunc (int x) {  
    if (x > 0) {
        myFunc(x--);
        printf("%d, ", x);
    }
    else
        return;
}

Ответы [ 4 ]

13 голосов
/ 13 января 2012

Нет, они не одинаковы.

Разница между x-- и --x заключается в том, находится ли возвращаемое значение до или после уменьшения.

В myFunc(x--), x-- возвращает старое значение. Таким образом, myFunc() получает повторяемость с тем же значением -> бесконечная рекурсия.

В myFunc(--x), --x возвращает новое значение. Так что myFunc() вызывается с уменьшающимся числом каждый раз -> без бесконечной рекурсии.


Это будет легче увидеть, если вы переместили printf в начало вызова функции:

void myFunc (int x) {  
    printf("%d, ", x);

    if (x > 0) {
        myFunc(x--);

    }
    else
        return;
}

Выход: (при вызове с 10)

10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, ...
5 голосов
/ 13 января 2012

Операция после декремента (x--) выполняется после , когда аргумент оценивается, поэтому myFunc повторно вызывается с одинаковым значением . Операция перед декрементом (--x) выполняется перед оценкой аргумента, которая работает как ожидалось.

3 голосов
/ 13 января 2012

Потому что модификация - это либо пост, либо пре. Когда вы вызываете x--, это post, и поэтому запускается после вызова myFunc, в этом случае ничего не делает. --x будет вызван до myFunc и поэтому повлияет на x.

1 голос
/ 13 января 2012

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

...