我可以在for循环的初始化中声明不同类型的变量吗?

grz*_*zkv 24 c++ scope for-loop initializer variable-declaration

为什么这个C++代码不能在VS2010下编译:

for ( int a = 0, short b = 0; a < 10; ++a, ++b ) {}
Run Code Online (Sandbox Code Playgroud)

虽然这个做了:

short b = 0;
for ( int a = 0; a < 10; ++a, ++b ) {}
Run Code Online (Sandbox Code Playgroud)

是否禁止在for-loop初始化程序中声明两个不同类型的变量?如果是这样,你怎么解决它?

Joh*_*itb 43

是的,这是禁止的.同样,你不能在一个声明语句中声明不同类型的变量(编辑:模块化@MrLister提到的声明符修饰符).你可以声明结构

for (struct { int a = 0; short b = 0; } d; d.a < 10; ++d.a, ++d.b ) {}
Run Code Online (Sandbox Code Playgroud)

C++ 03代码:

for (struct { int a; short b; } d = { 0, 0 }; d.a < 10; ++d.a, ++d.b ) {}
Run Code Online (Sandbox Code Playgroud)

当然,当一切都是0,你可以完全省略初始化器并写入= { }.

  • 我讨厌你分享这个的事实.我敢打赌,我们将在明年花一些时间来回答这个问题的愚蠢变化.实际上,我们永远不想再看到它. (21认同)
  • @Loki:这不是第一次`for struct` hack出现在SO上. (2认同)

Mr *_*ter 10

for循环无关.如果你int a = 0, short b = 0;在任何循环之外写,这也不会编译.
所以答案是:在单个语句中始终禁止声明两个不同类型的变量.

编辑:哦,对于迂腐,我确实意识到你可以在同一个语句中声明一个基类型和一个指针类型,例如一个int和一个int指针,所以那些将是不同的类型,是的.
嗯,这让我觉得.在32位环境中,指针将是4个字节,就像int一样,所以你可以使用short a = 0,*b = 0; 然后将b转换为int.嗯...