for 迴圈
執行迴圈。
用作 while 迴圈的簡短等價形式。
目錄 |
[編輯] 語法
attr-spec-seq(C23 起)(可選) for ( init-clause ; cond-expression ; iteration-expression ) loop-statement |
|||||||||
[編輯] 解釋
行為如下
- init-clause 可以是表示式 或宣告(C99 起)。
- 作為表示式的 init-clause 在首次評估 cond-expression 之前評估一次,其結果被丟棄。
|
(C99 起) |
- cond-expression 在迴圈體之前評估。如果表示式的結果為零,則立即退出迴圈語句。
- iteration-expression 在迴圈體之後評估,其結果被丟棄。評估 iteration-expression 後,控制權轉移到 cond-expression。
init-clause、cond-expression 和 iteration-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-expression、iteration-expression 或 loop-statement 的任何部分沒有可觀察行為(I/O、volatile 訪問、原子或同步操作),則具有無限迴圈的程式具有未定義行為。這允許編譯器最佳化掉所有不可觀察的迴圈,而無需證明它們會終止。唯一的例外是省略 cond-expression 或它是常量表達式的迴圈;for(;;)
始終是無限迴圈。
與所有其他選擇和迭代語句一樣,for 語句建立 塊作用域:在 init-clause、cond-expression 或 iteration-expression 中引入的任何識別符號在 loop-statement 之後超出作用域。 |
(C99 起) |
attr-spec-seq 是應用於 |
(自 C23 起) |
[編輯] 關鍵詞
[編輯] 注意
用作 loop-statement 的表示式語句建立自己的塊作用域,與 C++ 不同,它與 init-clause 的作用域不同
for (int i = 0; ; ) { long i = 1; // valid C, invalid C++ // ... }
可以使用 goto 進入迴圈體。以這種方式進入迴圈時,不執行 init-clause 和 cond-expression。(如果控制權隨後到達迴圈體的末尾,則可能發生重複,包括執行 cond-expression。)
[編輯] 示例
可能的輸出
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 迴圈 |