Объявление и инициализация переменной in for loop

Можно просто написать

for (int i = 0; ...

вместо

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

в C или С++?

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

Ответ 1

Его действительный в С++

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

gcc -std=c99 <file>.c

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

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

// loop NOT valid here.

Ответ 2

Да, это законно в С++ и на C99.

Ответ 3

Это совершенно законно для этого на C99 или С++:

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

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

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

Ответ 4

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

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

Например:

int i = 10;
i = 10 + PI;

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

Ответ 5

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

Ответ 6

Можно просто написать

Да.

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

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

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

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

Ответ 7

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

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

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