for循环中的混合声明

时间:2010-12-26 06:14:55

标签: c++ for-loop declaration

我想写一个 for 循环,如下所示;在初始化部分,我想声明不同类型的变量:

    for (int loop=0, long result = 1; loop <= 10 ; loop++, result *= 2 )
    {
        cout << "2^"<<loop<<"=" << result<<endl;
    }

但它给出错误,意味着它是不允许的。有什么解决方案吗?

7 个答案:

答案 0 :(得分:21)

不要写这样的代码。这是速度碰撞代码,有人会在某一天阅读这篇文章然后去Whoa!并失去5分钟的生命,试图找出你为什么这样做。那是5分钟他永远不会回来的,你没理由欠他的。

如果限制结果的范围非常重要,那么请使用额外的大括号:

{
    long result = 1;
    for (int loop = 0; loop <= 10; loop++)
    {
        cout << "2^" << loop << "=" << result << endl;
        result *= 2;
    }
}

现在把它放在最上面,你不仅要写可读代码,还要写可重复使用的代码:

void printPowersOfTwo(int from, int to)

答案 1 :(得分:6)

就像你试过的那样:

int loop=0, long result = 1;

其他任何地方。

你可以这样做:

for (struct { int loop; long result; } vars = { 0, 1};

但不要

答案 2 :(得分:3)

您可以在for循环声明部分声明多个变量,只要它们是单个基本类型(即您可以在单个声明中声明intint*,但不能intlong)。

答案 3 :(得分:3)

C ++不允许这样做。这就是它给出错误的原因。

顺便说一句,您可以通过在函数本身内部定义 local struct来实现此目的,

struct local {int loop; long result; };

for (local power = {0,1}; power.loop <= 10 ; power.loop++, power.result *= 2 )
{
        cout << 2 <<"^" <<power.loop << "=" << power.result << endl;
}

在ideone:http://www.ideone.com/ELT4a

处运行代码

或者您只需在struct循环中定义for,就像这样,

for ( struct {int loop; long result; } power = {0,1}; power.loop <= 10 ; power.loop++, power.result *= 2 )
{
        cout << 2 <<"^" <<power.loop << "=" << power.result << endl;
}

示例:http://www.ideone.com/X1MdC

答案 4 :(得分:3)

这样的事情会比尝试将所有循环体填充到一行中更加惯用。如果你使用相当正常的风格,任何后来必须整理你的代码的人都会很感激。调用循环索引变量“循环”实际上并不比调用它“i”更具表现力,并且在for循环中使用&lt; =而不是&lt;在我的经历中,这当然不常见。

long result=1;
for (int i=0; i<11; i++)
{
  std::cout << "2^" << i << " = " << result << std::endl;
  result *= 2;
}

答案 5 :(得分:2)

你必须写为 -

    int loop;
    long result;
    for (loop = 0, result = 1; loop <= 10; loop++, result *= 2) {
        cout << 2 <<"^" <<power.loop << "=" << power.result << endl;
    }

你不能在c ++中的循环中编写声明部分;

答案 6 :(得分:0)

如果这是初始化部分,你可以这样做。

 for (int loop=0; loop <= 10 ; loop++, result *= 2 )
    {
        static long result = 1;
        cout << "2^"<<loop<<"=" << result<<endl;
    }

作为警告,如果你两次打电话,这可能是一个问题。

我最近把它抽出来了

for (double tempTemp = 0.0,i=0;tempTemp >=targetTemp;i++)
{
  Sleep(100);
  deviceSafeCall(IL_GetFloat(myHandle,L"SensorTemperature",&tempTemp));
  cout << ".";
  static int fancy = 0;
  if (++fancy%10==0)
  {
      cout <<tempTemp <<endl;
  }
}