c – 有没有办法在for循环初始化器中定义两种不同类型的变量?

前端之家收集整理的这篇文章主要介绍了c – 有没有办法在for循环初始化器中定义两种不同类型的变量?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
您可以在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;
      }

猜你在找的C&C++相关文章