Do-while 迴圈

一個 DO-而迴圈是非常相似,而迴圈,但條件是在每個週期結束時檢查,而不是在開始。因此保證迴圈至少執行一次。

以下程式碼將列印 0,因為條件將在第一次迭代結束時計算為 false

int i =0;
do
{
    std::cout << i;
    ++i; // Increment counter
}
while (i < 0);
std::cout << std::endl; // End of line; 0 is printed to the console

注意:不要忘記 while(condition); 末尾的分號,這是 do-while 構造中需要的。

do-while 迴圈相反,以下內容不會列印任何內容,因為條件在第一次迭代開始時計算為 false

int i =0;
while (i < 0)
{
    std::cout << i;
    ++i; // Increment counter
}    
std::cout << std::endl; // End of line; nothing is printed to the console

注意: 使用 breakgotoreturn 語句可以退出 while 迴圈而不會使條件變為 false。

int i = 0;
do
{
    std::cout << i;
    ++i; // Increment counter
    if (i > 5) 
    {
        break;
    }
}
while (true);
std::cout << std::endl; // End of line; 0 1 2 3 4 5 is printed to the console

一個簡單的 do-while 迴圈也偶爾用於編寫需要自己範圍的巨集(在這種情況下,從巨集定義中省略了尾隨分號,並且需要由使用者提供):

#define BAD_MACRO(x) f1(x); f2(x); f3(x);

// Only the call to f1 is protected by the condition here
if (cond) BAD_MACRO(var);

#define GOOD_MACRO(x) do { f1(x); f2(x); f3(x); } while(0)

// All calls are protected here
if (cond) GOOD_MACRO(var);