if-else ステートメント (C++)if-else Statement (C++)

条件分岐を制御します。Controls conditional branching. Ifブロック内のステートメントは、 if 式が0以外の値 (または TRUE) に評価される場合にのみ実行されます。Statements in the if-block are executed only if the if-expression evaluates to a non-zero value (or TRUE). Expressionの値が0以外の場合は、ステートメントとブロック内の他のすべてのステートメントが実行され、else ブロック (存在する場合) がスキップされます。If the value of expression is nonzero, statement1 and any other statements in the block are executed and the else-block, if present, is skipped. Expressionの値が0の場合は、if ブロックがスキップされ、else ブロック (存在する場合) が実行されます。If the value of expression is zero, then the if-block is skipped and the else-block, if present, is executed. 0以外に評価される式は、Expressions that evaluate to non-zero are

  • trueTRUE
  • null 以外のポインター。a non-null pointer,
  • 0以外の算術値。any non-zero arithmetic value, or
  • 算術、ブール型、またはポインター型への明確な変換を定義するクラス型。a class type that defines an unambiguous conversion to an arithmetic, boolean or pointer type. (変換の詳細については、「標準変換」を参照してください)。(For information about conversions, see Standard Conversions.)

構文Syntax

if ( expression )
{
   statement1;
   ...
}
else  // optional
{
   statement2;
   ...
}

// C++17 - Visual Studio 2017 version 15.3 and later:
if ( initialization; expression )
{
   statement1;
   ...
}
else  // optional
{
   statement2;
   ...
}

// C++17 - Visual Studio 2017 version 15.3 and later:
if constexpr (expression)
{
    statement1;
    ...
}
else  // optional
{
   statement2;
   ...
}

Example

// if_else_statement.cpp
#include <iostream>

using namespace std;

class C
{
    public:
    void do_something(){}
};
void init(C){}
bool is_true() { return true; }
int x = 10;

int main()
{
    if (is_true())
    {
        cout << "b is true!\n";  // executed
    }
    else
    {
        cout << "b is false!\n";
    }

    // no else statement
    if (x == 10)
    {
        x = 0;
    }

    C* c;
    init(c);
    if (c)
    {
        c->do_something();
    }
    else
    {
        cout << "c is null!\n";
    }
}

if ステートメントと初期化子if statement with an initializer

Visual Studio 2017 バージョン15.3 以降( /std: c++ 17で使用可能):Ifステートメントには、名前付き変数を宣言して初期化する式を含めることもできます。Visual Studio 2017 version 15.3 and later (available with /std:c++17): An if statement may also contain an expression that declares and initializes a named variable. 変数が if ブロックのスコープ内でのみ必要な場合は、この形式の if ステートメントを使用します。Use this form of the if-statement when the variable is only needed within the scope of the if-block.

Example

#include <iostream>
#include <mutex>
#include <map>
#include <string>
#include <algorithm>

using namespace std;

map<int, string> m;
mutex mx;
bool shared_flag; // guarded by mx
void unsafe_operation() {}

int main()
{

    if (auto it = m.find(10); it != m.end())
    {
        cout << it->second;
        return 0;
    }

    if (char buf[10]; fgets(buf, 10, stdin))
    {
        m[0] += buf;
    }

    if (lock_guard<mutex> lock(mx); shared_flag)
    {
        unsafe_operation();
        shared_flag = false;
    }

    string s{ "if" };
    if (auto keywords = { "if", "for", "while" }; any_of(keywords.begin(), keywords.end(), [&s](const char* kw) { return s == kw; }))
    {
        cout << "Error! Token must not be a keyword\n";
    }
}

Ifステートメントのすべての形式で、構造体以外の任意の値を持つことができるexpressionは、すべての副作用を含めて評価されます。In all forms of the if statement, expression, which can have any value except a structure, is evaluated, including all side effects. ステートメントs にbreakcontinue、またはgotoが含まれている場合を除き、if ステートメントからプログラムの次のステートメントに制御が渡されます。Control passes from the if statement to the next statement in the program unless one of the statements contains a break, continue, or goto.

if...elseステートメントのelse句は、対応するelseステートメントを持たない、同じスコープ内の最も近いifステートメントに関連付けられています。The else clause of an if...else statement is associated with the closest previous if statement in the same scope that does not have a corresponding else statement.

constexpr ステートメントの場合 if constexpr statements

Visual Studio 2017 バージョン15.3 以降( /std: c++ 17で使用可能):関数テンプレートでは、 if constexprステートメントを使用して、複数の関数オーバーロードに頼ることなく、コンパイル時の分岐決定を行うことができます。Visual Studio 2017 version 15.3 and later (available with /std:c++17): In function templates, you can use an if constexpr statement to make compile-time branching decisions without having to resort to multiple function overloads. たとえば、パラメーターのアンパックを処理する1つの関数を記述できます (ゼロパラメーターのオーバーロードは必要ありません)。For example, you can write a single function that handles parameter unpacking (no zero-parameter overload is needed):

template <class T, class... Rest>
void f(T&& t, Rest&&... r)
{
    // handle t
    do_something(t);

    // handle r conditionally
    if constexpr (sizeof...(r))
    {
        f(r...);
    }
    else
    {
        g(r...);
    }
}

関連項目See also

選択ステートメントSelection Statements
キーワードKeywords
switch ステートメント (C++)switch Statement (C++)