Как делают я инициализирую несколько переменных в для (; ;) цикл в C?

Я думал, что можно было инициализировать несколько переменных в a for цикл:

for (int i = 0, char* ptr = bam; i < 10; i++) { ... }

Но я просто узнал, что это не возможно. GCC дает следующую ошибку:

ошибка: ожидаемый неполный идентификатор перед 'символом'

Это действительно верно, что Вы не можете инициализировать переменные различных типов в a for цикл?

31
задан Peter Mortensen 9 September 2018 в 20:14
поделиться

5 ответов

Вы можете (но обычно не должны) использовать локальный тип struct.

for ( struct { int i; char* ptr; } loopy = { 0, bam };
      loopy.i < 10 && * loopy.ptr != 0;
      ++ loopy.i, ++ loopy.ptr )
    { ... }

Начиная с C++11, вы можете инициализировать отдельные части более элегантно, если они не зависят от локальной переменной:

for ( struct { int i = 0; std::string status; } loop;
      loop.status != "done"; ++ loop.i )
    { ... }

Это просто почти достаточно читабельно, чтобы действительно использовать.


В C++17 планируется решить эту проблему с помощью структурированных привязок:

for ( auto [ i, status ] = { 0, ""s }; status != "done"; ++ i )

Однако подробный набор функций и синтаксис все еще в процессе разработки.

46
ответ дан 27 November 2019 в 21:46
поделиться

Если вам действительно нужно, чтобы переменные оставались в пределах цикла, вы можете написать

{ char* ptr = bam; for (int i = 0; i < 10; i++) { ... } }

Это немного некрасиво, но работает.

13
ответ дан 27 November 2019 в 21:46
поделиться

Согласно http://linuxsoftware.co.nz/cppgrammar.html#for-init-statement в операторе for-init можно получить только простое объявление или выражение (которое не может содержать объявление). Это означает, что ответ "нет" (если я правильно проанализировал BNF :))

-2
ответ дан 27 November 2019 в 21:46
поделиться

Попробуйте следующее:

int i;
char* ptr;
for (i = 0, ptr = bam; i < 10; i++) { ... }
7
ответ дан 27 November 2019 в 21:46
поделиться

Это правда, что вы не можете одновременно объявлять и инициализировать деклараторы разных типов. Но это не относится к циклам for. Если вы сделаете это, то получите ошибку:

int i = 0, char *ptr = bam;

тоже. Первый пункт цикла for может быть (C99 §6.8.5.3) "объявлением" или "выражением void". Обратите внимание, что вы можете сделать:

int i = 0, *j = NULL;
for(int i = 0, *j = NULL;;){}

потому что i и *j имеют тип int. Точный синтаксис объявления приведен в §6.7

18
ответ дан 27 November 2019 в 21:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: