簡體   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