首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在for循环中声明几个新计数器

在for循环中声明几个新计数器
EN

Stack Overflow用户
提问于 2013-10-21 14:37:24
回答 6查看 179关注 0票数 4

考虑以下代码:

代码语言:javascript
运行
复制
vector<int> v;
for(vector<int>::iterator vi = n.begin(), int i = 0;
    vi != n.end();
    ++vi, ++i){}

有什么理由不允许这样做吗?我希望能够定义两个新的计数器,包括vi和索引i。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2013-10-21 15:01:55

这是C++ Primer一书中的解释

与任何其他声明一样,init语句可以定义多个对象。然而,init语句可能只是一个声明语句,因此,所有变量都必须具有相同的基类型。例如,我们可以编写一个循环来复制vector的元素,如下所示: //记住v和stop的大小,当我们到达原始的最后一个元素时:(v.size()i= 0,sz = v.size();i != sz;++i) v.push_back(vi); 在这个循环中,我们在init语句中定义了索引i和循环控件sz

这是合理的,for循环的语法是:

C++11§6.5.3 for语句stmt.for for语句 for (for-init-语句;条件选择;表达式选择)语句

for-init-statement仅是一条语句。声明两种不同类型的变量将使其至少有两条语句。

票数 4
EN

Stack Overflow用户

发布于 2013-10-21 15:01:35

如果要在for循环中使用两个不同类型的变量,则必须在for循环范围之外声明一个变量。通过将循环封装在一组大括号中,可以强制执行第二个范围:

代码语言:javascript
运行
复制
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.
票数 2
EN

Stack Overflow用户

发布于 2013-10-21 15:09:54

有什么理由不允许这样做吗?

因为C++的神秘声明语法不允许您在同一声明语句中声明不相关类型的对象;而for循环的初始化器只允许一个声明语句。

我希望能够定义两个新的计数器,包括vi和索引i

如果您不介意污染周围的块,您可以在循环之外声明一个或两个。否则,你可以把它们放在一个结构里:

代码语言:javascript
运行
复制
for (struct {vector<int>::iterator vi; int i;} x = {n.begin(), 0}; 
     x.vi != n.end();
     ++x.vi, ++x.i) {}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19497435

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档