Да, допустимо иметь объявление (с инициализатором) в пункте 1 цикла for (начиная с C99).Давайте превратим ваш C ++ в код C (поскольку ваш вопрос был помечен как «c», когда я писал это):
$ cat x.c
#include <stdio.h>
int main(void) {
for (struct { int a;} t = { 0 }; t.a < 3; ++t.a) {
printf("%d\n", t.a);
}
return 0;
}
$ gcc -Wall -Wextra -std=c99 x.c
$ ./a.out
0
1
2
Соответствующий C99:
6.8.5.3 Оператор for
1 Оператор
for ( clause-1 ; expression-2 ; expression-3 ) statement
ведет себя следующим образом: Выражение expression-2 является управляющим выражением, которое вычисляется перед каждым выполнением тела цикла.Выражение expression-3 оценивается как пустое выражение после каждого выполнения тела цикла.Если условие-1 является объявлением, область действия любых переменных, которые оно объявляет, является оставшейся частью объявления и всего цикла, включая два других выражения;оно достигается в порядке выполнения до первой оценки управляющего выражения.Если условие-1 является выражением, оно оценивается как пустое выражение перед первой оценкой управляющего выражения.133)