C++ 为什么是c++;不支持for循环中的多个初始值设定项?

C++ 为什么是c++;不支持for循环中的多个初始值设定项?,c++,for-loop,programming-languages,language-lawyer,C++,For Loop,Programming Languages,Language Lawyer,可能重复: #包括 使用名称空间std; int main() { 对于(int i=0,双j=3.0;i,不同的数据类型用分隔;>(如果不是函数)。在 < 循环中,一旦发现;< /C> >,意思是改变了。 for (<initializations>; <condition>; <next operation>) 因为已经采用了语法。在变量声明/定义中,用逗号分隔会添加相同类型的新变量,而不是不同类型的新变量。该语法在for循环中可用: for ( s

可能重复:

#包括
使用名称空间std;
int main()
{
对于(int i=0,双j=3.0;i<10;i++,j++=0.1)

C++语法中的CUT< P>,<强>不同的数据类型用<代码>分隔;>(如果不是函数)。在<代码> < <代码>循环中,一旦发现<代码>;< /C> >,意思是改变了。
for (<initializations>; <condition>; <next operation>)

因为已经采用了语法。在变量声明/定义中,用逗号分隔会添加相同类型的新变量,而不是不同类型的新变量。该语法在
for
循环中可用:

for ( std::vector<int>::const_iterator it = v.begin(), end = v.end();
      it != end; ++it ) {
   // do something here
}
for(std::vector::const_迭代器it=v.begin(),end=v.end();
它!=结束;++它){
//在这里做点什么
}

如果您想在初始化中同时使用
int
double
,那么一种方法就是定义一个匿名结构!是的,您也可以在
for
循环中定义
结构。这似乎是C++的一个鲜为人知的特性:

#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; 
}

在线演示:

这就是语言的语法:)没有任何技术可以阻止语言的设计者按照您所期望的语法滑动,但出于某种原因,他们没有:(我有解决办法,而且很漂亮:@BenjaminLindley:我认为这很难看:P.看我的答案。@BenjaminLindley刚刚Horrible@Nawaz:这是一个笑话,我想没有人明白。+1是一个漂亮的解决方案,从来没有想过这个。但我认为,匿名
struct
是g++扩展。所有编译器都允许这种方式吗?@iammilind:它不是g+它是标准C++。我被你的第二句话弄糊涂了。我们是否有疑问可以定义结构?看起来好像不是什么特别的肯定。什么也可以。也提到了吗?@罗宾:我说的是因为这是大多数C++程序员都不知道的一个特性。@洛基斯塔里:同意。但是,它比 TyPufType Ne:X:模板y::MyOyType 要读得多。(循环内部或外部)但是,我认为Askk正在争论为什么C++中不允许使用代码< int i,double d;< /> >,通过增加一些复杂性。@ IAMMININD:for循环的第一个块是一个变量声明。在这个上下文中,逗号已经有了一个与所有其他变量声明一致的含义和精确的语义。当然,可以。特例所有构造,将其称为for循环声明列表,并完全重新定义可用于声明的相同概念。结果将是一组更复杂的规则,在其中支持his(可以说不太频繁的用例),我将不得不重新键入迭代器的本已复杂的类型,而不需要额外的实际值(它不启用任何新构造…如果需要定义多个不同类型的变量,则有一些简单的解决方法。对于初学者,正如您所建议的,您可以将循环包含在一个作用域中,并声明该作用域中的所有其他变量。您还可以通过使用复合类型来避免额外的作用域,如
std::pair
)(对p(0,0.0);p.first<10;++p.first,p.second+=0.1)
…或多个此类变量的元组。
for ( std::vector<int>::const_iterator it = v.begin(), end = v.end();
      it != end; ++it ) {
   // do something here
}
#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