请考虑以下代码:
vector<int> v;
for(vector<int>::iterator vi = n.begin(), int i = 0;
vi != n.end();
++vi, ++i){}
有理由不允许这样做吗?我希望能够定义 2 个新计数器,vi 和索引 i。
C++入门书中的解释:
与任何其他声明一样,init-语句可以定义多个对象。但是,init 语句可能只是一个声明语句。因此,所有变量必须具有相同的基类型。例如,我们可以编写一个循环来复制末尾
vector
的元素,如下所示:// remember the size of v and stop when we get to the original last element for (decltype(v.size()) i = 0, sz = v.size(); i != sz; ++i) v.push_back(v[i]);
在这个循环中,我们在 init 语句中定义了索引
i
和循环控制sz
。
这是有道理的,for
循环的语法是:
C++11 §6.5.3 for 语句
for
声明for ( for-init-statement ; condition opt ; expression opt ) statement
for-init-statement
只是一个陈述。声明两种不同类型的变量将使其至少有两个语句。
有理由不允许这样做吗?
因为 C++ 的晦涩声明语法不允许在同一声明语句中声明不相关类型的对象;而 for
循环的初始化器只允许单个声明语句。
我希望能够定义 2 个新计数器,包括
vi
和索引i
。
如果你不介意污染周围的块,你可以在循环外声明一个或两个。否则,您可以将它们放在一个结构中:
for (struct {vector<int>::iterator vi; int i;} x = {n.begin(), 0};
x.vi != n.end();
++x.vi, ++x.i) {}
答案是"除了语法需要之外
,没有任何原因"。不过,我可以想象,如果允许,代码可能会变得非常复杂,所以这是不向语言添加对此的支持的一个很好的理由。
您可以创建自己的范围来绑定它:
std::vector<int> v;
{
std::vector<int>::iterator it = n.begin(), end = n.end();
int i = 0;
for ( ; it != end; ++it, ++i)
{}
}
中使用两个不同类型的变量,则必须在 for 循环的范围之外声明一个变量。您可以通过将循环括在一组大括号内来强制执行第二个范围:
vector<int> v;
{
int i = 0;
for(vector<int>::iterator vi = n.begin(); vi != n.end(); ++vi, ++i) { /* DO STUFF */ }
} //i's scope ends here.
您只能编写一个声明语句,但它可以定义多个变量,例如:
for ( int i = 0, j = 10 ; ... )
看看逗号运算符维基百科页面会有所帮助,特别是第一个例子。
int a=1, b=2, c=3, i=0; // comma acts as separator in this line, not as an operator
另外,为什么不做这样的事情呢?
vector<int> v;
vector<int>::iterator vi = n.begin();
int i = 0;
for(; vi != n.end(); ++vi, ++i)
{
}