如何在C ++中构造一个for循环复合?

时间:2014-09-07 17:13:46

标签: c++ c++11 for-loop lambda

for循环的计数器部分(第三部分)是否允许另一个for循环?在我试图优雅地编写代码以生成直角三角形时,我写了这个,但它不会编译:

#include <stdio.h>
int main()
{   
    int i, j, N = 5;
    for (i = 1;
         i <= N; 
         (for (j = 1; j <= i; j++, printf("%c", '0'));), i++)
       printf("\n");
    }
    return 0;
}

8 个答案:

答案 0 :(得分:7)

不允许只有表达式或声明。

编辑:对不起。我以为你在谈论循环的条件部分。在循环的表达式部分中,只允许表达式。

您可以使用包含此for循环的lambda表达式。例如

for ( i = 1;
      i <= N;
      []( int i ) { for ( j = 1; j <= i; j++, printf("%c", '0' ) ); }( i ), i++)

这是一个示范性的例子

#include <iostream>

int main() 
{
    int N = 10;

    for ( int i = 1;
          i < N;
          []( int i ) 
          { 
            for ( int j = 1; j < i; j++, ( std::cout <<  '*' ) ); 
          }( i ), i++ )
    {
        std::cout << std::endl;
    }               

    return 0;
}

输出

*
**
***
****
*****
******
*******
********

或者您可以在外部循环外定义lambda表达式,以使程序更具可读性。例如

#include <iostream>

int main() 
{
    int N = 10;

    auto inner_loop = []( int i ) 
    { 
        for ( int j = 1; j < i; j++, ( std::cout <<  '*' ) ); 
    };


    for ( int i = 1; i < N; inner_loop( i ), i++ )
    {
        std::cout << std::endl;
    }               

    return 0;
}

考虑到一般情况下,其他帖子中显示的嵌套循环无法用lambda-expression替换循环。例如,外部循环可以包含将跳过内部循环的continue语句。因此,如果您需要在任何情况下都执行内部循环,而不依赖于continue语句,那么使用lambda表达式的这种结构将会有所帮助。:)

答案 1 :(得分:5)

没有必要这样做。因为for循环可以很容易地用while循环替换,for循环的每个部分都可以放在另一个地方,在那里可以使用复杂的结构。在您的情况下,您可以将循环更改为以下内容:

for (i = 1; i <= N; i++) {
    printf("\n");
    for (j = 1; j <= i; j++) {
        printf("%c", '0');
    }
}

但是,如果您确实需要执行复杂操作,则可以使用gcc扩展名(复合语句):

for (i = 1;
     i <= N; 
     ({for (j = 1; j <= i; j++) putchar('0'); }), i++) {
   printf("\n");
}

答案 2 :(得分:4)

for()循环的计数器部分中,允许使用表达式,但语句不允许。
C / C ++中的每个for()行都形成一个新语句(它不是表达式)。

但是,如果需要,可以嵌套多个for()循环 例如,由于您需要在计数器部分中使用新循环,这意味着您需要在主for()循环结束时执行循环。

这是方案:

  for (int i = 0; i < i_max; i++) {
      // stuff...


      for (int j = 0; j < j_max; j++) {
            // stuff..
      }  
  }

答案 3 :(得分:3)

您不能这样做,因为for的条件和增量部分只能包含表达式。但for循环是迭代语句

简单地将循环嵌套,就像理智的程序员一样:

#include <stdio.h>
int main()
{   
    int N = 5;
    for (int i = 1; i <= N; i++) {
        for (int j = 1; j <= i; j++)
             printf("0");
        printf("\n");
    }
}

如果你感觉不舒服,你可以使用lambda:

#include <stdio.h>
int main()
{   
    int N = 5;
    for (
        int i = 1;
        i <= N; 
        [=](){ for (int j = 1; j <= i; j++) printf("0"); }(), printf("\n"), i++
    ) ;
}

答案 4 :(得分:2)

最短的解决方案:

main(i){for(i=1;i<11;printf("%0*d\n",i++,0));}

输出:

0
00
000
0000
00000
000000
0000000
00000000
000000000
0000000000

LIVE DEMO

答案 5 :(得分:1)

提示使用lambda,向Michael Burr提示。感谢评论员要求我使用putchar()

#include <stdio.h>

int main() {
  int N;
  scanf("%d", &N);

  for (int i = 0; i < N; i++, [i] {
         for (int j = 1; j <= i; j++, putchar('0'))
           ;
       }(), printf("\n"))
    ;

  return 0;
}

LIVE DEMO

答案 6 :(得分:1)

优雅带来清晰。 当我想创建一个字符串时,我构造了一个名为std::string的C ++对象。

#include <iostream>
#include <string>

int main()
{
  char c = '0';
  const int n = 5;

  for (int i = 1; i <= n; ++i)
  {
    std::cout << std::string(i, c) << '\n';
  }
}

因此在这种特殊情况下不需要嵌套的for - 循环。 否则在其他答案建议的外部循环体中放置for - 语句。

答案 7 :(得分:0)

我认为我们应该避免混淆代码,除非我们因代码复杂而获得报酬。

相关问题