Первый объявляет переменную в области за пределами цикла; после окончания цикла переменная будет существовать и использоваться. Второй объявляет переменную так, что она принадлежит области видимости цикла; после цикла переменная перестает существовать, предотвращая непреднамеренное / ошибочное использование переменной.
В C99, C ++, Java и других подобных языках вы найдете в основном второй синтаксис, так как он безопаснее - индекс цикла принадлежит циклу и не изменен / не используется в других местах Однако вы увидите много первого в более старом коде C, так как ANSI C не позволял объявлять переменную цикла в цикле подобным образом.
Чтобы привести пример:
int i;
// ... lots of stuff
for ( i = 0; i < 5; i++ ){
printf("%d\n",i); // can access i; prints value of i
}
printf("%d\n",i); // can access i; prints 5
Для контраста:
for (int i = 0; i < 5; i++ ){
std::cout << i << std::endl; // can access i; prints value of i
}
std::cout << i << std::endl; // compiler error... i not in this scope