簡體   English   中英

對於c程序中的循環混淆

[英]For loop confusion in c program

為什么循環從2運行到7?

int i;    
for(i=1;i<=6;printf("\n%d\n",i))    
i++;

這個的輸出是

 2 3 4 5 6 7 

但是i限制是6。

for循環的語法是

for ( clause-1 ; expression-2 ; expression-3 ) 語句

執行如下,引用C11 ,章節§6.8.5.3,( 強調我的

表達式expression-2在每次執行循環體之前計算的控制表達式。 在每次執行循環體之后, expression-3被評估為void表達式 [....]

這里, i++是body, printf("\\n%d\\n",i)表達式-3

所以,執行的順序就像是

 i = 1;
 start loop

    i < = 6          //==> TRUE
    i++;            //i == 2
    printf         // Will print 2    ///iteration 1  done

    i < = 6         //==> TRUE
    i++;           //i == 3
    printf        // Will print 3   ///iteration 2  done
    .
    .
    .
    i < = 6         //==> TRUE
    i++;           //i == 6
    printf        // Will print 6   ///iteration 5  done

    i < = 6         //==> TRUE
    i++;           //i == 7
    printf        // Will print 7   ///iteration 6  done

    i < = 6 ==> FALSE

 end loop.

for循環一樣

for(i=1;i<=6;printf("\n%d\n",i))    
    i++;

相當於

{
    i = 1;  // Initialization clause from for loop

    while (i <= 6)    // Condition clause from for loop
    {
        i++;  // Body of for loop

        printf("\n%d\n", i);  // "Increment" clause from for loop
    }

}

如您所見, printf在變量i遞增完成,這當然意味着它將打印遞增的值( 27 )。

循環的工作方式相當於現在顯而易見的

int i;    
for (i = 1; i <= 6; /*intentionally blank*/){
    i++;
    printf("\n%d\n", i);
}

從概念上講, for循環中的第3個表達式就在循環體的右大括號之前運行。

你以不尋常的方式編寫了for循環。

下面給出for循環的操作。

  1. 首先完成初始化。 i=1

  2. 然后檢查表達式i<=6

  3. 然后身體進行i++

  4. 然后執行增量。 在你的情況下這是printf("\\n%d\\n",i)

  5. 重復步驟2到4,直到步驟2為假。

在您的情況下,您可以看到printf將首先針對i==7完成,然后將檢查表達式i==7 之后,for循環將退出。 類似地,第一次打印僅在i增加一次后完成

因此,首先打印為2 ,最后打印為7

你已經錯誤地編寫了循環 - 你已經用增量代碼交換了循環體。 因此,在完成循環體中的i++之后,它會將printf作為增量進行處理,而這應該是另一種方式。

正確寫入for循環如下。

int i;    
for(i=1;i<=6;i++)
    printf("\n%d\n",i)    

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM