如何在C++中构造用于循环的复合函数
How to construct a compound for loop in C++?
在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表达式替换循环。例如,外循环可以包含跳过内循环的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*dn",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;
}
现场演示
我认为我们应该避免混淆代码,除非我们因使代码变得复杂而获得报酬。
- 用于循环编译的 constexpr
- C++用于循环跳过向量的元素?
- OpenMP 内部的函数调用用于循环
- 用于循环访问多个集合的数据结构
- Leetcode C++用于循环条件
- fworldperscreenwidththpixel如何用于循环绘制
- C 迭代用于循环并在其中调用功能
- 在C 中打印矩阵二级对角线,用于循环
- 简单的C 嵌套以用于循环程序,以打印带有星星错误的正方形
- 使用4用于循环的4矩阵上的数组下标的“ int [int]类型”
- 用于循环,if表示Ardiuno驱动湿度控制的说明
- C++ 用于循环后增量前增量差异
- 将C 17支持基于较简单的范围用于循环
- 为什么我的if语句不适用于循环
- 使用基于自动的范围用于循环VS,使用对循环范围的基于对的范围
- 使用用于循环C 的字符串反转
- 用于循环范围范围
- 用于循环的c++(c++11方式和旧版本方式)
- c++amp:复合类型,用于循环,在GPU上声明
- 括号内用于循环初始化