繁体   English   中英

在C ++中将FOR循环转换为DO WHILE循环

[英]converting a FOR loop to a DO WHILE loop in C++

我正在尝试将其转换为使用时间; 它应该根据您输入的数字显示一个金字塔:

    int size,a,b,c;
    printf("Enter a Number: ");
    scanf("%d",&size);
    printf("\n");

    // for loop starts here
    for(a=1; a<=size; a++)
    {

     for(b=1; b<=size-a; b++)
     {
      printf(" ");
     }

     for(c=1; c<=(2*a)-1; c++)
     {
      printf("*");
     }

      printf("\n");
    }
     getch();
   }

这是我到目前为止所做的:

    int size;
    int a=1;
    int b=1;
    int c=1;

    do {

     a++;

      do {
       c++;
       printf("*");
      } while(c<=((2*a)-1));

        do {
       printf(" ");
          b++;
      } while(b<=(size-a));

      printf("\n");

    } while(a<=size);

    getch();
   }

Aaaa和它没有显示相同的输出,有什么建议吗? TIA :)

一个for循环

for (BEGIN; COND; INC)
{
    WORK;
}

相当于while循环

{
    BEGIN;
    while (COND)
    {
        WORK;
        INC;
    }
}

…除了WORK部分中的continue语句的效果(带有for循环, continue跳至INC ),以及for循环的BEGIN中声明的名称与COND声明的名称位于同一声明性区域外。

但是,它并没有形成优雅的do-while循环。

{
    BEGIN;
    do
    {
        if (! COND) break;
        WORK;
        INC;
    } while (true)
}

或者(尽管它重复代码)

{
    BEGIN;
    if (COND)
    {
        do
        {
            WORK;
            INC;
        } while (COND)
    }
}

编译器实际上倾向于将for循环转换为等效于do-while循环的代码。 结果看起来像这样(使用尼尔·柯克的元变量):

BEGIN;
if(COND) {
    do {
        WORK;
        INC;
    } while(COND);
}

请注意, COND出现在两个不同的位置。 如果检查生成的程序集是否存在for循环,通常会看到这种效果,除非优化器足够聪明地弄清楚(或由程序员使用__assumeCOND第一次不会__assume

#include <stdio.h>
void main()
{
    int size;
    int i=1;
    int j;
    int k;
    printf("Enter the number:\n");
    scanf("%d",&size);
    do
    {
        j=i;
        do
        {
            printf(" ");  
            j++;
        }while(j<=size);
        k=1;
        do
        {
            printf("*");
            k++;
        }while(k<=(2*i)-1);
        printf("\n");
        i++;
    }while(i<=size);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM