Унарный оператор приращения в арифметике указателей - PullRequest
2 голосов
/ 26 декабря 2010

это мой первый пост.

У меня есть эта функция для обращения строки в C что я нашел.

    void reverse(char* c) {
        if (*c != 0) {
            reverse(c + 1);
        }
        printf("%c",*c);
    }

Работает нормально, но если заменить:

reverse(c + 1);

с:

reverse(++c);

первый символ исходной строки усекается. Мой вопрос: почему бы заявления не эквивалентны в этом случае?

Спасибо

Ответы [ 4 ]

7 голосов
/ 26 декабря 2010

Поскольку c + 1 не меняет значение c, а ++c делает.

4 голосов
/ 26 декабря 2010

Давайте немного расширим ответ Фреда. ++c эквивалентно c = c+1, а не c+1. Если вы замените строку reverse(c+1) на reverse(++c), то c изменится. Это не имеет значения, когда речь идет о рекурсивном вызове (почему?), Но означает, что c указывает куда-то новое в printf.

2 голосов
/ 26 декабря 2010

c + 1 не меняет c,

++c увеличивает c, а затем использует новое значение в замененном рекурсивном вызове, reverse(++c)

1 голос
/ 26 декабря 2010

Как уже отмечалось, ++c изменяет значение c, но c+1 не делает этого.

Это не имеет значения в самом рекурсивном вызове: reverse(c+1) и reverse(++c) будут проходить одинаковозначение до reverse;разница возникает, когда вы используете c в printf после рекурсивного вызова - в случае ++c значение c изменилось к тому времени, когда вы достигли printf.

...