Счетчик For-Loop остается? - PullRequest
       18

Счетчик For-Loop остается?

5 голосов
/ 01 декабря 2010

Простой вопрос. Представьте себе это в ANSI-C:

int i;

for(i=0 ; i<5 ; i++){
   //Something...
}

printf("i is %d\n", i);

Будет ли вывод "i is 5"?

Сохранено ли i или значение i не определено после цикла?

Ответы [ 5 ]

14 голосов
/ 01 декабря 2010

Да.Если i объявлен вне цикла for, он остается в области видимости после выхода из цикла.Он сохраняет любое значение, которое он имел в точке выхода из цикла.

Если вы объявили I в цикле:

for (int i = 0 ; i < 5 ; i++)
{

}

Тогда я не определен после выхода из цикла.

1 голос
/ 01 декабря 2010
Значение

i будет 5 после вашего цикла.Если вы не сделали что-то вроде

i = 50000;

внутри него.

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

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

И она пост-написана для каждого ходацикла, для которого конечным условием является «остановка, когда я больше или равен 5».

Так что действительно имеет смысл для i быть равным 5 в этой точке.

Область видимости блока не совсем совпадает с областью действия функции C. Переменная i не «магически возвращается» к своему предыдущему значению, когда вы выходите из области видимости цикла.

0 голосов
/ 01 декабря 2010

Да, переменные действительны только внутри блока, в котором они объявлены.Вот пример:

#include <stdio.h>

void main(int argc, char *argv[])
{
    if(argc == 2) {
        int x;
        x = 7;
    }

    x = 1;
}

Это компилятор:

gcc ex.c
ex.c: In function ‘main’:
ex.c:10: error: ‘x’ undeclared (first use in this function)
ex.c:10: error: (Each undeclared identifier is reported only once
ex.c:10: error: for each function it appears in.)
0 голосов
/ 01 декабря 2010

Также обычно рекомендуется не использовать «i» после выхода из цикла в большинстве стандартов кодирования, которые я когда-либо читал.В частности, НЕ делайте:

for(i = 0; i < num_elements; i++)
{
    if(element[i].id == id)
    {
        /* Do something to element here. */
        break;
    }
}

if(i == num_elements)
{
    fprintf(stderr, "Failed to find element %d.", id);
    succeeded == false;
}

Пока это будет работать, плохое кодирование.Это менее читабельно и ремонтопригодно, чем альтернативы.Например,

succeeded = false;

for(i = 0; i < num_elements; i++)
{
    if(element[i].id == id)
    {
        /* Do something to element here. */
        succeeded = true;
        break;
    }
}

if(false == succeeded)
{
    fprintf(stderr, "Failed to find element %d.", id);
}
...