Законно ли объявлять структуры для цикла for C ++? - PullRequest
0 голосов
/ 29 мая 2018

Я только что экспериментировал со следующей программой в компиляторе Gcc.Я задался вопросом: объявлена ​​структура в цикле for и работает нормально в GCC.

#include <iostream>

int main()
{
      int i = 0;
      for(struct st{ int a{9}; }t; i<3; i++)
            std::cout<<t.a<<std::endl;
}

Итак, законно ли объявлять структуры в цикле for?

DEMO

1 Ответ

0 голосов
/ 29 мая 2018

Да, допустимо иметь объявление (с инициализатором) в пункте 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)

...