Объявление и инициализация переменной в цикле for - PullRequest
10 голосов
/ 06 июля 2010

Могу ли я просто написать

for (int i = 0; ...

вместо

int i;
for (i = 0; ...

на C или C ++?

(И будет ли переменная i доступна только внутри цикла?)

Ответы [ 7 ]

20 голосов
/ 06 июля 2010

Действителен в C ++

Это не было законно в исходной версии C.
Но было принято как часть C в C99 (когда некоторые функции C ++ были обратно перенесены на C)
Использование gcc

gcc -std=c99 <file>.c

Переменная действительна внутри оператора for и оператора, который зациклен.Если это оператор блока, то он действителен для всего блока.

for(int loop = 0; loop < 10; ++loop)
{
    // loop valid in here aswell
}

// loop NOT valid here.
18 голосов
/ 06 июля 2010

Да, это разрешено в C ++ и в C99.

5 голосов
/ 06 июля 2010

Совершенно законно делать это в C99 или C ++:

for( int i=0; i<max; ++i )
{
    //some code
}

и его while эквивалент:

{
    int i=0
    while( i<max )
    {
        //some code
        ++i;
    }
}
3 голосов
/ 06 июля 2010

На самом деле for(int i=0;i<somevalue;i++) всегда использовался в качестве предпочтительного способа определения цикла for в c и c ++.

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

Например:

int i = 10;
i = 10 + PI;

будет автоматически изменено, когда вы нажмете на цикл for и объявите i = 0

2 голосов
/ 06 июля 2010

Могу ли я написать просто

Да.

(И будет ли переменная i доступна только внутри цикла?)

Зависит от компилятора и его версии.AFAIK, в современных компиляторах я доступен только внутри цикла.Некоторые старые компиляторы позволяли мне быть доступным и вне цикла.Некоторые компиляторы разрешают доступ ко мне вне цикла и предупреждают вас о нестандартном поведении.

Я думаю (но я не уверен в этом), что "я внецикл "был использован где-то в VC98 (Visual Studio 6, который AFAIK, также имел глобально определенную переменную" i "где-то, что могло привести к чрезвычайно интересному поведению).Я думаю , что (майкрософт) компиляторы, сделанные где-то около 2000 года. 2003 начали печатать "нестандартные расширения, используемые" для использования i вне цикла, и в конце концов эта функциональность полностью исчезла.Его нет в visual studio 2008.

Вероятно, это произошло в соответствии со стандартом, но я не могу дать ссылку или цитату в данный момент.

2 голосов
/ 06 июля 2010

Да и да.Но для C, очевидно, ваш компилятор должен быть в режиме C99.

0 голосов
/ 27 декабря 2016

если вы используете переменную вне цикла, она будет меняться каждый раз, когда вы инициализируете ее внутри цикла

int i = 0;
for(int e = 0; e < 10; e++)
{
 i = e;
}

теперь значение i будет меняться каждый раз

...