Я думал, что можно было инициализировать несколько переменных в a for
цикл:
for (int i = 0, char* ptr = bam; i < 10; i++) { ... }
Но я просто узнал, что это не возможно. GCC дает следующую ошибку:
ошибка: ожидаемый неполный идентификатор перед 'символом'
Это действительно верно, что Вы не можете инициализировать переменные различных типов в a for
цикл?
Вы можете (но обычно не должны) использовать локальный тип 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 )
Однако подробный набор функций и синтаксис все еще в процессе разработки.
Если вам действительно нужно, чтобы переменные оставались в пределах цикла, вы можете написать
{ char* ptr = bam; for (int i = 0; i < 10; i++) { ... } }
Это немного некрасиво, но работает.
Согласно http://linuxsoftware.co.nz/cppgrammar.html#for-init-statement в операторе for-init можно получить только простое объявление или выражение (которое не может содержать объявление). Это означает, что ответ "нет" (если я правильно проанализировал BNF :))
Попробуйте следующее:
int i;
char* ptr;
for (i = 0, ptr = bam; i < 10; i++) { ... }
Это правда, что вы не можете одновременно объявлять и инициализировать деклараторы разных типов. Но это не относится к циклам 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