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)
不允许只有表达式或声明.
编辑:对不起.我以为你在谈论循环的条件部分.在循环的表达式部分中,只允许表达式.
您可以使用包含此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表达式的这种结构将会有所帮助.:)
没有必要这样做.因为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)