while 迴圈
出自 cppreference.com
有條件地重複執行語句。
目錄 |
[編輯] 語法
attr (選填) while ( condition ) statement |
|||||||||
| 屬性 | - | (C++11 起) 任意數量的 屬性 (attributes) |
| 條件 (condition) | - | 一個 條件 |
| statement | - | 一個 語句 (statement)(通常為複合語句) |
[編輯] 條件
|
(C++26 起) |
- 如果它在語法上可以被解析為表達式,則將其視為表達式。否則,將其視為宣告(非結構化綁定宣告)(C++26 起)。
當控制流到達 condition 時,該條件會產生一個值,用於決定是否執行 statement。
[編輯] 表達式
如果 condition 是表達式,其產生的值是該表達式在上下文中轉換為 bool 的值。如果該轉換格式錯誤,則程式格式錯誤。
[編輯] 宣告
如果 condition 是簡單宣告,其產生的值是決策變數(見下文)在上下文中轉換為 bool 的值。如果該轉換格式錯誤,則程式格式錯誤。
[編輯] 非結構化綁定宣告
該宣告具有以下限制
- 語法上符合以下形式
|
(直到 C++11) |
|
(C++11 起) |
- 宣告子 (declarator) 不能指定 函式 或 陣列。
- 型別說明符序列(C++11 前)宣告說明符序列 只能包含型別說明符和 constexpr,並且它(C++11 起) 不能定義 類別 或 列舉。
該宣告的決策變數就是宣告出的變數。
結構化綁定宣告該宣告具有以下限制 該宣告的決策變數是由該宣告所引入的創造變數 e。 |
(C++26 起) |
[編輯] 解釋
while 語句等同於
/* 標籤 */ :
|
|||||||||
若 condition 是一個宣告,則其所宣告的變數會在迴圈的每次迭代中被建立並銷毀。
若需要在 statement 內部終止迴圈,可以使用 break 語句作為終止語句。
若需要在 statement 內部終止當前迭代,可以使用 continue 語句作為捷徑。
[編輯] 註解
無論 statement 是否為複合語句,它總會引入一個 區塊作用域 (block scope)。在其中宣告的變數僅在迴圈主體內可見,換句話說,
while (--x >= 0) int i; // i goes out of scope
等同於
while (--x >= 0) { int i; } // i goes out of scope
作為 C++ 進度保證 (forward progress guarantee) 的一部分,若一個迴圈(非 平凡無限迴圈)(自 C++26)不具備 可觀察行為 (observable behavior) 且無法終止,則其行為是 未定義的 (undefined)。編譯器被允許移除此類迴圈。
[編輯] 關鍵字
[編輯] 範例
執行此程式碼
#include <iostream> int main() { // while loop with a single statement int i = 0; while (i < 10) i++; std::cout << i << '\n'; // while loop with a compound statement int j = 2; while (j < 9) { std::cout << j << ' '; j += 2; } std::cout << '\n'; // while loop with a declaration condition char cstr[] = "Hello"; int k = 0; while (char c = cstr[k++]) std::cout << c; std::cout << '\n'; }
輸出
10 2 4 6 8 Hello
[編輯] 參閱
| C 文件 中的 while
|