Namespaces
Variants

while loop

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

条件付きで文を繰り返し実行します。

目次

構文

attr  (オプション) while ( condition ) statement
attr - (since C++11) 任意の数の attributes
condition - 条件式 condition
statement - statement (通常は複文)

条件

condition は、 expression または simple declaration のいずれかです。

  • 構文的に structured binding 宣言として解決できる場合、それはstructured binding宣言として解釈されます。
(C++26以降)
  • 構文的に式として解決できる場合は、式として扱われます。それ以外の場合は、構造化束縛宣言ではない宣言として扱われます (since C++26) (C++26以降)

制御が条件式に到達すると、条件式は値を生成し、その値を使用して statement が実行されるかどうかが決定されます。

condition が式である場合、その評価結果は式が文脈的に bool に変換された値となります。この変換が不適格な場合、プログラムは不適格となります。

宣言

condition が単純な宣言である場合、その結果の値は決定変数(下記参照)の値を文脈的に bool に変換したものである。その変換が不適格な場合、プログラムは不適格となる。

非構造化バインディング宣言

この宣言には以下の制限があります:

  • 構文的には以下の形式に従います:
  • type-specifier-seq declarator = assignment-expression
(C++11まで)
  • attribute-specifier-seq (オプション) decl-specifier-seq declarator brace-or-equal-initializer
(C++11以降)

宣言の決定変数は、宣言された変数です。

Structured binding 宣言

この宣言には以下の制限があります:

この宣言の決定変数は、宣言によって導入される発明された変数 e です

(C++26以降)

説明

A while 文は以下と等価です

/* ラベル */ :

{

if ( 条件 )
{

goto /* ラベル */ ;
}

}

condition が宣言である場合、それが宣言する変数はループの各反復ごとに破棄され、再作成されます。

ループを statement 内で終了させる必要がある場合、 break statement を終了文として使用できます。

現在の反復処理を statement 内で終了させる必要がある場合、 continue statement をショートカットとして使用できます。

注記

statement が複文であるかどうかに関わらず、常に block scope を導入します。その中で宣言された変数はループ本体でのみ可視です。言い換えると、

while (--x >= 0)
    int i;
// i はスコープ外に出る

は以下と同じです

while (--x >= 0)
{
    int i;
} // i はスコープから外れる

C++の 前方進行保証 の一部として、 自明な無限ループではない 自明な無限ループ (C++26以降) ループが 観測可能な動作 を持たずに終了しない場合、その動作は 未定義 です。コンパイラはそのようなループを削除することが許可されています。

キーワード

while

#include <iostream>
int main()
{
    // 単一文のwhileループ
    int i = 0;
    while (i < 10)
         i++;
    std::cout << i << '\n';
    // 複合文のwhileループ
    int j = 2;
    while (j < 9)
    {
        std::cout << j << ' ';
        j += 2;
    }
    std::cout << '\n';
    // 宣言条件付きwhileループ
    char cstr[] = "Hello";
    int k = 0;
    while (char c = cstr[k++])
        std::cout << c;
    std::cout << '\n';
}

出力:

10
2 4 6 8
Hello

関連項目