Есть ли какая-то польза от объявления счетчика за пределами тела l oop в C99? - PullRequest
1 голос
/ 10 апреля 2020

Я знаком с C ++ и недавно решил выучить C. Учебник, которому я следую, часто пишет для таких циклов:

int i;

for (i = 0; i < 5; i++)
{
    printf("%d", i);
}

Вы можете видеть, что counter (i) объявлен вне тела для l oop. Когда я пишу это в C (и C ++), я пишу:

for (int i = 0; i < 5; i++)
{
    printf("%d", i);
}

Я немного исследовал это, и кажется, что последнее было незаконно в C89 и было введено только в C99. Тем не менее, учебник, который я использую, основан на C99, и я также видел много современного C кода, в котором счетчик все еще объявлен вне тела для l oop.

Следовательно, вопрос, который я задаю: есть ли практическая польза от объявления счетчика вне тела для l oop в C99? Другими словами, каким образом мне написать это?

Примечание: я видел, что есть «похожие вопросы», но большинство из них спрашивают, почему счетчик объявлен вне для l oop тело в некотором коде, а не есть ли какая-либо выгода. С учетом вышесказанного был один похожий вопрос, который задавался о пользе, но он был в C ++, и я не уверен, есть ли разница между двумя языками в этом отношении.

1 Ответ

6 голосов
/ 10 апреля 2020

Основными преимуществами объявления счетчика l oop перед оператором for являются:

  • переносимость на компиляторы до C99,
  • доступ к этой переменной за пределами конец for l oop.

Если определено до оператора for, эта переменная все еще действительна и находится в области видимости после l oop, что может быть очень полезно, если l oop было завершено с помощью оператора break:

void foo(void) {
    int i;
    for (i = 0; i < 100; i++) {
        if (bar(i))
            break;
    }
    ...
    if (i != 100) {
        printf("loop was exited after %d calls\n", i);
    }
}

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

Если вам не нужен доступ к счетчику l oop после оператора for, его объявление в первом предложении оператора for улучшает удобочитаемость и удобство обслуживания.

И наоборот, если вам нужна переносимость обратно к компиляторам до C99, вам следует избегать таких специфических для C99 функций c, как эта.

...