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

lif*_*nce 7 c++ lambda for-loop c++11

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;
}
Run Code Online (Sandbox Code Playgroud)

Vla*_*cow 7

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

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

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

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

这是一个示范性的例子

#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;
}
Run Code Online (Sandbox Code Playgroud)

输出是

*
**
***
****
*****
******
*******
********
Run Code Online (Sandbox Code Playgroud)

或者你可以在外部循环外定义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;
}
Run Code Online (Sandbox Code Playgroud)

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


Ale*_*lko 5

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

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

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

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