Объявление и инициализация переменной в для цикла

Я могу записать просто

for (int i = 0; ...

вместо

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

в C или C++?

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

10
задан Georg Fritzsche 6 July 2010 в 20:09
поделиться

6 ответов

Допустимо в 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.
20
ответ дан 3 December 2019 в 13:24
поделиться

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

18
ответ дан 3 December 2019 в 13:24
поделиться

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

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

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

{
    int i=0
    while( i<max )
    {
        //some code
        ++i;
    }
}
5
ответ дан 3 December 2019 в 13:24
поделиться

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

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

Например:

int i = 10;
i = 10 + PI;

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

3
ответ дан 3 December 2019 в 13:24
поделиться

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

Да.

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

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

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

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

2
ответ дан 3 December 2019 в 13:24
поделиться

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

2
ответ дан 3 December 2019 в 13:24
поделиться