名稱空間
變體
操作

while 迴圈

來自 cppreference.com
< c‎ | 語言

重複執行 statement,直到 expression 的值等於零。測試在每次迭代之前進行。

目錄

[編輯] 語法

attr-spec-seq(可選) while ( expression ) statement
表示式 - 任何標量型別表示式。此表示式在每次迭代之前進行求值,如果其結果等於零,則迴圈退出。
語句 - 任何語句,通常是複合語句,用作迴圈體
屬性說明序列 - (C23)可選的屬性列表,應用於迴圈語句

[編輯] 解釋

while 語句會重複執行 statement(也稱為迴圈體),直到 expression(也稱為控制表示式)的比較結果等於零。無論迴圈體是正常進入還是透過 goto 跳轉到 statement 中間,都會發生重複執行。

在每次執行 statement 之前(除非透過 goto 進入),都會對 expression 進行求值。如果需要在迴圈體之後對控制表示式進行求值,可以使用 do-while 迴圈

如果需要在某個點終止迴圈的執行,可以使用 break 語句作為終止語句。

如果需要在迴圈體末尾繼續迴圈的執行,可以使用 continue 語句作為快捷方式。

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

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

(C99 起)

[編輯] 註釋

布林表示式和指標表示式經常用作迴圈控制表示式。布林值 false 和任何指標型別的空指標值都等於零。

[編輯] 關鍵字

while

[編輯] 示例

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
enum { SIZE = 8 };
int main(void)
{
    // trivial example
    int array[SIZE], n = 0;
    while(n < SIZE) array[n++] = rand() % 2;
    puts("Array filled!");
    n = 0;
    while(n < SIZE) printf("%d ", array[n++]);
    printf("\n");
 
    // classic strcpy() implementation
    // (copies a null-terminated string from src to dst)
    char src[] = "Hello, world", dst[sizeof src], *p = dst, *q = src;
    while((*p++ = *q++)) // double parentheses (that are not strictly necessary)
                         // used to suppress warnings, ensuring that this is an
                         // assignment (as opposed to a comparison) by intention,
                         // whose result is used as a truth value
        ; // null statement
    puts(dst);
}

輸出

Array filled!
1 0 1 1 1 1 0 0 
Hello, world

[編輯] 參考文獻

  • C17 標準 (ISO/IEC 9899:2018)
  • 6.8.5.1 while 語句 (p: 109)
  • C11 標準 (ISO/IEC 9899:2011)
  • 6.8.5.1 while 語句 (p: 151)
  • C99 標準 (ISO/IEC 9899:1999)
  • 6.8.5.1 while 語句 (p: 136)
  • C89/C90 標準 (ISO/IEC 9899:1990)
  • 3.6.5.1 while 語句

[編輯] 另請參見

C++ 文件,關於 while 迴圈