如何在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

LIVE DEMO

另一答案

优雅与清晰。当我想创建一个字符串时,我构造了一个名为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;
}

LIVE DEMO

另一答案

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

以上是关于如何在C ++中构造一个for循环复合?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 for 循环中调用参数化构造函数。

在C中的while循环或for循环之后没有代码执行[重复]

python 如何在一个for循环中遍历两个列表

PHP 如何结束本次循环,进入下一个循环

c语言一个死循环中为啥执行完一个功能函数就退出了?

Qt如何循环创建线程