for循环中出现的混合声明

5
我想编写一个如下所示的 for 循环;在初始化部分,我想要声明不同类型的变量:
    for (int loop=0, long result = 1; loop <= 10 ; loop++, result *= 2 )
    {
        cout << "2^"<<loop<<"=" << result<<endl;
    }

但是它出现了错误,意味着它不被允许。有没有解决办法?

7个回答

21
不要写出这样的代码。它是速度减缓代码,有人某一天会读到它并感到惊讶!,浪费5分钟时间试图弄清楚你为什么这样做。这是他永远无法挽回的5分钟,你没有充分的理由欠他这个人情。
如果限制result的范围真的很重要,那么请使用额外的一组大括号:
{
    long result = 1;
    for (int loop = 0; loop <= 10; loop++)
    {
        cout << "2^" << loop << "=" << result << endl;
        result *= 2;
    }
}

现在将此放在顶部,你不仅编写了易读的代码,还编写了可重用的代码:
void printPowersOfTwo(int from, int to)

1
也被称为“基努·里维斯秒”。 - Hans Passant
提醒一下...那个Keanu可能是你未来的自己...现在谁在矩阵里? - Homer6

6

就好像你尝试:

int loop=0, long result = 1;

在任何其他地方都可以这样做:

你可以这样做:

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

但是不要这样做


1
@dsd 但除非有非常好的理由,否则请不要实际使用它。仅仅因为你可以做到并不意味着你应该这样做。 - Anycorn

3

这在C++中是不允许的,这就是为什么会报错。

顺便说一下,您可以通过在函数内部定义一个本地的 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
或者,您可以在 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;
}

Sample : http://www.ideone.com/X1MdC


3
复杂并不总是优雅的。它更难注意到其中的错误。 - Öö Tiib
4
@ Öö Tiib:我认为这并不复杂。人们不使用(甚至不知道)它,这就是为什么它看起来很复杂。我认为复杂的是模板元编程。 - Nawaz
@Nawaz: 是的,这取决于读者。我看过几个编码标准,甚至将在同一行声明多个变量视为过于复杂。 - Öö Tiib
@Öö Tiib:同意。这取决于受众...但我认为,C++程序员习惯了有点复杂的编码...如果他们不写这个,他们会写其他东西...特别是当他们使用STL时,比如<algorithm>头文件... - Nawaz

3

这样的写法比试图将整个循环体压缩到一行更符合惯用语。任何后来需要整理您的代码的人都会感激您使用相当正常的风格。将循环索引变量称为“loop”并不比称其为“i”更具表现力,而在for循环中使用“<=”而不是“<”在我的经验中确实不太常见。

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

3

只要它们是单个基本类型,您可以在for循环声明部分中声明多个变量(例如,您可以在单个声明中声明一个int和一个int*,但不能声明一个int和一个long)。


2

你需要写成:

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

在C++中,你不能在循环内部编写声明部分。


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接