Интересный оператор приращения в C (в цикле while) - PullRequest
0 голосов
/ 31 марта 2011

Я хочу реализовать алгоритм факториала, и следующий код дает мне неверный результат для факториала (5)

int factorial(int n)
{
    int i = 1, ret = 1;
    while(i++<=n)
        ret *= i;
    return ret;
}

Похоже, что код продолжит работать, даже когда я = 6, я неЯ не понимаю, почему цикл while не остановился.

Ответы [ 5 ]

4 голосов
/ 31 марта 2011

Вы используете оператор постинкремента, который означает, что окончательная проверка для i <= n происходит до того, как i увеличивается в последний раз.Другими словами, когда i равно 5, ваш код:

check if i <= 5 -> true

increment i -> i is now 6

execute loop -> executes for i = 6

check if i <= 5 -> false (i is now 6)

Вы должны изменить на:

while(++i <= n)
3 голосов
/ 31 марта 2011

Попробуйте сделать одну вещь за утверждение.

int factorial(int n)
{
    int i = 1, ret = 1;
    while(i<=n)
    {
        i++;
        ret *= i;
    }
    return ret;
}

Проверьте различия между версиями выше и ниже этого текста.

int factorial(int n)
{
    int i = 1, ret = 1;
    while(i<=n)
    {
        ret *= i;
        i++;
    }
    return ret;
}
0 голосов
/ 31 марта 2011

Вы делаете одну дополнительную итерацию цикла.

Вместо (i++<=n) вам действительно нужно сделать (i<=n), а затем добавить i++; после ret*=1.

На самом деле это гораздо более аккуратно, используя цикл ИМХО для цикла.

0 голосов
/ 31 марта 2011

Вот как i++ работает. вам нужно ++i

0 голосов
/ 31 марта 2011

i++ возвращает значение i и только затем увеличивает i.(В отличие от ++i, который сначала увеличивает i и возвращает увеличенное значение)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...