Могу ли я объявлять переменные разных типов при инициализации цикла for?

Почему этот код С++ не компилируется под VS2010:

for ( int a = 0, short b = 0; a < 10; ++a, ++b ) {}

в то время как это делает:

short b = 0;
for ( int a = 0; a < 10; ++a, ++b ) {}

Запрещено ли объявление двух переменных разных типов внутри инициализатора for-loop? Если да, то как вы можете обойти это?

Ответ 1

Да, это запрещено. Так же, как иначе вы не можете объявлять переменные разных типов в одном объявлении (изменить: modulo модификаторы декларатора, о которых упоминает @MrLister). Вы можете объявлять структуры

for (struct { int a = 0; short b = 0; } d; d.a < 10; ++d.a, ++d.b ) {}

Код С++ 03:

for (struct { int a; short b; } d = { 0, 0 }; d.a < 10; ++d.a, ++d.b ) {}

Конечно, если все 0, вы можете полностью опустить инициализаторы и написать = { }.

Ответ 2

Ничего общего с циклом for. Это также не компилируется, если вы пишете int a = 0, short b = 0; вне любого цикла.
Таким образом, ответ таков: всегда запрещено объявлять две переменные разных типов в одном утверждении.

Edit: О, для педантичного я понимаю, что вы можете объявить базовый тип и тип указателя в том же самом операторе, например int и int pointer, так что это будут разные типы, да.
Хм, это заставляет меня думать. В 32-битной среде указатель будет 4 байта, как и int, поэтому вы можете использовать короткие a = 0, * b = 0; а затем отбрасывает b в int. Хм...

Ответ 3

То, что запрещено, - это конец инструкции с запятой, как в int a = 0, short ...

Если вы хотите использовать это обозначение, то bothe variable muss имеют один и тот же тип int i = 0, s = 0;

Ответ 4

Вы можете объявить только один оператор for for. Таким образом, второй код является полезным.

Ответ 5

Вы не можете объявить переменную в while условие for (шаг сборки).

for ( a = 0, short b = 0; a < 10; ++a, ++b ) {}

который не работает.