Подтвердить что ты не робот

Почему С++ не поддерживает несколько инициализаторов в цикле for?

Возможный дубликат:
В С++ почему я не могу написать цикл for() следующим образом: for (int я = 1, double i2 = 0;
Почему так сложно записывать for-loop в С++ с 2 переменными цикла?

#include <iostream>
using namespace std;

int main()
{
    for (int i = 0, double j = 3.0; i < 10; i++, j+=0.1)
        cout << i << j << endl;
    return 0;
}

не компилируется, поскольку в блоке инициализации for-цикла имеется два объявления.

Но почему?

4b9b3361

Ответ 1

В грамматике С++ разные типы данных разделяются ; (если не функция). В цикле for, как только ; будет найден, значение будет изменено. то есть.

for (<initializations>; <condition>; <next operation>)

Другая причина, возможно, в том, чтобы избежать сложности в уже сложной грамматике, эта функция не допускается.

Если вы хотите объявить переменные в области цикла for, то вы всегда можете имитировать эту ситуацию:

int main()
{
  {
    double j = 3.0;
    for (int i = 0; i < 10; i++, j+=0.1)
        cout << i << j << endl;
  }
    return 0;
}

Ответ 2

Если вы хотите int и double и то, и другое, в инициализации, один из способов сделать это - определить анонимную структуру! Да, вы можете определить struct в цикле for. Кажется, это менее известная функция С++:

#include <iostream>

int main()
{
    for( struct {int i; double j;} v = {0, 3.0}; v.i < 10; v.i++, v.j+=0.1)
       std::cout << v.i << "," << v.j << std::endl; 
}

Вывод:

0,3
1,3.1
2,3.2
3,3.3
4,3.4
5,3.5
6,3.6
7,3.7
8,3.8
9,3.9

Демо-версия онлайн: http://ideone.com/6hvmq

Ответ 3

Потому что синтаксис уже сделан. В объявлении/определении переменной разделение запятыми добавляет новые переменные того же типа, но не из разных типов. Этот синтаксис доступен в циклах for:

for ( std::vector<int>::const_iterator it = v.begin(), end = v.end();
      it != end; ++it ) {
   // do something here
}