名稱空間
變體
操作

for 迴圈

來自 cppreference.com
< c‎ | 語言

執行迴圈。

用作 while 迴圈的簡短等價形式。

目錄

[編輯] 語法

attr-spec-seq(C23 起)(可選) for ( init-clause ; cond-expression ; iteration-expression ) loop-statement

[編輯] 解釋

行為如下

  • init-clause 可以是表示式 或宣告(C99 起)
  • 作為表示式的 init-clause 在首次評估 cond-expression 之前評估一次,其結果被丟棄。
  • 作為宣告的 init-clause 在整個迴圈體中都有效,包括 init-clause 的其餘部分、整個 cond-expression、整個 iteration-expression 和整個 loop-statement。此宣告中宣告的變數只允許使用 autoregister 儲存類說明符
(C99 起)
  • cond-expression 在迴圈體之前評估。如果表示式的結果為零,則立即退出迴圈語句。
  • iteration-expression 在迴圈體之後評估,其結果被丟棄。評估 iteration-expression 後,控制權轉移到 cond-expression

init-clausecond-expressioniteration-expression 都是可選的。如果省略 cond-expression,則將其替換為非零整數常量,這會使迴圈無限

for(;;) {
   printf("endless loop!");
}

loop-statement 不是可選的,但它可以是空語句

for(int n = 0; n < 10; ++n, printf("%d\n", n))
    ; // null statement

如果需要在某個點終止迴圈的執行,可以在 loop-statement 內的任何位置使用 break 語句

continue 語句loop-statement 內的任何位置使用時,會將控制權轉移到 iteration-expression

如果無限迴圈的 cond-expressioniteration-expressionloop-statement 的任何部分沒有可觀察行為(I/O、volatile 訪問、原子或同步操作),則具有無限迴圈的程式具有未定義行為。這允許編譯器最佳化掉所有不可觀察的迴圈,而無需證明它們會終止。唯一的例外是省略 cond-expression 或它是常量表達式的迴圈;for(;;) 始終是無限迴圈。

與所有其他選擇和迭代語句一樣,for 語句建立 塊作用域:在 init-clausecond-expressioniteration-expression 中引入的任何識別符號在 loop-statement 之後超出作用域。

(C99 起)

attr-spec-seq 是應用於 for 語句的可選 屬性列表。

(自 C23 起)

[編輯] 關鍵詞

for

[編輯] 注意

用作 loop-statement 的表示式語句建立自己的塊作用域,與 C++ 不同,它與 init-clause 的作用域不同

for (int i = 0; ; ) {
    long i = 1;   // valid C, invalid C++
    // ...
}

可以使用 goto 進入迴圈體。以這種方式進入迴圈時,不執行 init-clausecond-expression。(如果控制權隨後到達迴圈體的末尾,則可能發生重複,包括執行 cond-expression。)

[編輯] 示例

#include <stdio.h>
#include <stdlib.h>
enum { SIZE = 8 };
int main(void)
{
    int array[SIZE];
    for(size_t i = 0 ; i < SIZE; ++i)
        array [i] = rand() % 2;
    printf("Array filled!\n");
    for (size_t i = 0; i < SIZE; ++i)
        printf("%d ", array[i]);
    putchar('\n');
}

可能的輸出

Array filled!
1 0 1 1 1 1 0 0

[編輯] 參考

  • C17 標準 (ISO/IEC 9899:2018)
  • 6.8.5.3 for 語句 (p: 110)
  • C11 標準 (ISO/IEC 9899:2011)
  • 6.8.5.3 for 語句 (p: 151)
  • C99 標準 (ISO/IEC 9899:1999)
  • 6.8.5.3 for 語句 (p: 136)
  • C89/C90 標準 (ISO/IEC 9899:1990)
  • 3.6.5.3 for 語句

[編輯] 另請參閱

C++ 文件,關於 for 迴圈