Смешанное объявление в цикле for - PullRequest
5 голосов
/ 26 декабря 2010

Я хочу написать цикл для , как показано ниже;в разделе инициализации я хочу объявить переменные разных типов:

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

Но это дает ошибку, значит, это не разрешено.Любое решение для этого?

Ответы [ 7 ]

21 голосов
/ 26 декабря 2010

Не пишите такой код.Это код скорости, кто-то прочтет это когда-нибудь и пойдет Вау! и потеряет 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)
6 голосов
/ 26 декабря 2010

это как если бы вы пытались:

int loop=0, long result = 1;

где-либо еще.

вы можете сделать это:

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

но не

3 голосов
/ 26 декабря 2010

Что-то вроде этого было бы чертовски более идиоматичным, чем пытаться засунуть все ваше тело цикла в одну строку. Любой, кому потом придется разбираться с вашим кодом, оценит его, если вы будете использовать довольно обычный стиль. Вызов переменной индекса цикла loop «loop» на самом деле не более выразителен, чем вызов ее «i», и использование

long result=1;
for (int i=0; i<11; i++)
{
  std::cout << "2^" << i << " = " << result << std::endl;
  result *= 2;
}
3 голосов
/ 26 декабря 2010

Это не разрешено 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

3 голосов
/ 26 декабря 2010

Вы можете объявить несколько переменных в части объявления цикла for, если они имеют один базовый тип (т. Е. Вы можете объявить int и int* в одном объявлении, но не int и long).

2 голосов
/ 26 декабря 2010

Вы должны написать как -

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

Вы не можете написать часть объявления в цикле в c ++;

0 голосов
/ 15 января 2013

Если это раздел инициализации, вы можете сделать это.

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