如何在C ++中构造一个for循环复合?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在C ++中构造一个for循环复合?相关的知识,希望对你有一定的参考价值。
在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;
}
不允许只有表达式或声明。
编辑:对不起。我以为你在谈论循环的条件部分。在循环的表达式部分中,只允许表达式。
您可以使用包含此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表达式的这种结构将会有所帮助。:)
没有必要这样做。因为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");
}
在for()
循环的计数器部分中,允许表达式,但语句不允许。
C / C ++中的每个for()
行都形成一个新的陈述(它不是表达式)。
但是,如果需要,您可以嵌套几个for()
循环。
例如,由于您需要在计数器部分中使用新循环,这意味着您需要在主for()
循环结束时执行循环。
这是方案:
for (int i = 0; i < i_max; i++) {
// stuff...
for (int j = 0; j < j_max; j++) {
// stuff..
}
}
你不能这样做,因为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++
) ;
}
最短的解决方案:
main(i){for(i=1;i<11;printf("%0*d\n",i++,0));}
输出:
0
00
000
0000
00000
000000
0000000
00000000
000000000
0000000000
优雅与清晰。当我想创建一个字符串时,我构造了一个名为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
语句放在外循环体中,如其他答案所示。
帽子提示Michael Burr建议使用lambda
。感谢评论员要求我使用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;
}
我认为我们应该避免混淆代码,除非我们因代码复杂而获得报酬。
以上是关于如何在C ++中构造一个for循环复合?的主要内容,如果未能解决你的问题,请参考以下文章