您可以在for循环中定义2个相同类型的变量:
int main() { for (int i = 0,j = 0; i < 10; i += 1,j = 2*i) { cout << j << endl; } }
但是定义不同类型的变量是违法的:
int main() { for (int i = 0,float j = 0.0; i < 10; i += 1,j = 2*i) { cout << j << endl; } }
有没有办法做到这一点? (我不需要在循环中使用i,只需j.)
如果你完全被黑客攻击并且模糊不清,那对我来说没问题.
在这个人为的例子中,我知道你可以对两个变量使用double.我正在寻找一般答案.
请不要建议移动body之外的任何变量,可能对我不可用,因为一个迭代器必须在循环之后消失并且for语句将被包含在我的foreach宏中:
#define foreach(var,iter,instr) { \ typeof(iter) var##IT = iter; \ typeof(iter)::Element var = *var##IT; \ for (; var##_iterIT.is_still_ok(); ++var##IT,var = *var#IT) { \ instr; \ } \ }
因此可以使用它:
foreach(ii,collection,{ cout << ii; }).
但我需要一些可以像这样使用的东西:
foreach(ii,collection) cout << ii;
请不要引入任何运行时开销(但编译速度可能会很慢).
解决方法
这是一个使用boost预处理器的版本(这只是为了好玩.对于现实世界的答案,请参阅上面的@ kitchen的一个):
FOR((int i = 0)(int j = 0.0),i < 10,(i += 1,j = 2 * i)) { }
第一部分指定了一系列声明:(a)(b)….稍后声明的变量可以引用在它们之前声明的变量.第二和第三部分和往常一样.在第二和第三部分中出现逗号的地方,括号可用于防止它们分隔宏参数.
我知道有两个技巧用于声明变量,这些变量稍后在宏外部添加的复合语句中可见.第一个使用条件,如if:
if(int k = 0) ; else COMPOUND_STATEMENT
然后k是可见的.当然,它总是要评估为假.所以它不能被我们使用.另一个背景是这个:
for(int k = 0; ...; ...) COMPOUND_STATEMENT
这就是我将在这里使用的内容.我们必须注意只进行一次COMPOUND_STATEMENT迭代.执行增量和条件检查的实际for循环必须在最后,因此附加的复合语句附带到它.
#include <boost/preprocessor.hpp> #include <iostream> #define EMIT_DEC_(R,D,DEC) \ for(DEC; !_k; ) #define FOR(DECS,COND,INC) \ if(bool _k = false) ; else \ BOOST_PP_SEQ_FOR_EACH(EMIT_DEC_,DECS,DECS) \ for(_k = true; COND; INC) int main() { FOR((int i = 0)(float j = 0.0f),j = 2 * i)) { std::cout << j << std::endl; } }
它创建了一堆for语句,每个语句都嵌套到另一个语句中.它扩展为:
if(bool _k = false) ; else for(int i = 0; !_k; ) for(float j = 0.0f; !_k; ) for(_k = true; i < 10; (i += 1,j = 2 * i)) { std::cout << j << std::endl; }