使用for each (in)和for(:)的区别是什么?

26

作为一个有Python背景的人,当我第一次看到 for ( : ) 循环时感到非常惊讶:

vector<int> vec = {1,2,3,4};
int sum = 0;
for (int i : vec){
    sum += i;
}
//sum is now 10

这是一个非常有用的结构,当您不需要多次使用值的索引时,应该使用它。

但今天我发现也有一种for each ( in )循环,使用方法如下:

vector<int> vec = {1,2,3,4};
int sum = 0;
for each (int i in vec){
    sum += i;
}
//sum is now 10

有趣的是,第二个搜索结果大多与微软有关,而不是通常的C++参考网站。

这两个循环之间有什么区别?


3
第一个是标准C++(确切地说是C++11),第二个可能使用了宏或者是编译器特定的,不是标准的。 - stefan
1
第二个是用于迭代实现IEnumerable接口的对象的C++/CLI或C++/CX语法。第一个是用于C++ 11迭代器的常规语法。 - Adriano Repetti
@Stefan 我们可以排除宏选项,它们在VS2013中用紫色突出显示。它看起来像一个常规的关键字。但是,是的,它似乎不是C++11。 - iFreilicht
2个回答

22

第一个是称为基于范围的for循环,是C++11语言的一种特性。它允许你像这样迭代具有可用begin()和end()方法(成员或非成员)或是数组的范围。

第二个是Microsoft特定的语法,可用于C++/CLI,但也提供给了C++。它允许遍历数组或集合。不推荐使用它,应该优先选择基于范围的for循环。参见for each, in


3
微软似乎喜欢向C++中引入新的东西,但却不推荐使用它们。;) 感谢解释! - iFreilicht
7
自从VS2005推出以来,VC++就已经支持这个功能了。而C++11中引入基于范围的for循环的完成时间是这个功能问世的六年之后。 - Marius Bancila

4
foreach循环是由Microsoft Visual C++提供的。 请参见:http://msdn.microsoft.com/en-us/library/xey702bw%28VS.80%29.aspx 它不是标准的C++语法,而且相当老旧(在VS2005中引入)。编译器(VS)会在编译时将此循环转换为适当的for循环。
因此最好使用常规的for ( ; ; )循环或for ( : )循环,以便与其他编译器如g++兼容。

那么我的理解是,在C++11最终确定之前,他们引入了“for each”语法,对吗? - iFreilicht
C++11在2011年就已经“定案”了,比那个时间早得多。 - Mo Beigi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接