如何在C++中构造用于循环的复合函数

How to construct a compound for loop in C++?

本文关键字:用于 循环 复合函数 C++      更新时间:2023-10-16

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;
}

现场演示

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