Почему С++ не поддерживает несколько инициализаторов в цикле 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-цикла имеется два объявления.
Но почему?
Ответы
Ответ 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
}