Istruzione if-else (C++)

Un'istruzione if-else controlla la diramazione condizionale. Le istruzioni in if-branch vengono eseguite solo se restituisce condition un valore diverso da zero (o true). Se il valore di condition è diverso da zero, viene eseguita l'istruzione seguente e l'istruzione che segue viene ignorata else . In caso contrario, l'istruzione seguente viene ignorata e, se è presente un'istruzione else che segue viene eseguita.else

condition Le espressioni che restituiscono valori diversi da zero sono:

  • true
  • puntatore non Null,
  • qualsiasi valore aritmetico diverso da zero o
  • tipo di classe che definisce una conversione non ambigua in un tipo aritmetico, booleano o puntatore. Per informazioni sulle conversioni, vedere Conversioni standard.

Sintassi

init-statement:
expression-statement
simple-declaration

condition:
expression
attribute-specifier-seqoptdecl-specifier-seqdeclaratorbrace-or-equal-initializer

statement:
expression-statement
compound-statement

expression-statement:
expressionopt;

compound-statement:
{statement-seqopt}

statement-seq:
statement
statement-seq statement

if-branch:
statement

else-branch:
statement

selection-statement:
ifconstexpropt17 opt17(init-statementcondition)if-branch
ifconstexpropt17 opt17(init-statementcondition)if-branchelseelse-branch

17 Questo elemento facoltativo è disponibile a partire da C++17.

Istruzioni if-else

In tutte le forme dell'istruzione if , conditionche può avere qualsiasi valore ad eccezione di una struttura, viene valutato, inclusi tutti gli effetti collaterali. Il controllo passa dall'istruzione all'istruzione if successiva nel programma, a meno che l'oggetto eseguito if-branch o else-branch non contenga un breakoggetto , continueo goto.

La else clausola di un'istruzione if...else è associata all'istruzione precedente if più vicina nello stesso ambito che non ha un'istruzione corrispondente else .

Esempio

Questo codice di esempio mostra diverse if istruzioni in uso, sia con che senza else:

// if_else_statement.cpp
#include <iostream>

using namespace std;

int main()
{
    int x = 10;

    if (x < 11)
    {
        cout << "x < 11 is true!\n";  // executed
    }
    else
    {
        cout << "x < 11 is false!\n"; // not executed
    }

    // no else statement
    bool flag = false;
    if (flag == true)
    {
        x = 100; // not executed
    }

    int *p = new int(25);
    if (p)
    {
        cout << *p << "\n"; // outputs 25
    }
    else
    {
        cout << "p is null!\n"; // executed if memory allocation fails
    }
}

Output:

x < 11 is true!
25

istruzione if con un inizializzatore

A partire da C++17, un'istruzione if potrebbe contenere anche un'espressione init-statement che dichiara e inizializza una variabile denominata. Usare questo formato dell'istruzione if quando la variabile è necessaria solo nell'ambito dell'istruzione if. Specifico di Microsoft: questo modulo è disponibile a partire da Visual Studio 2017 versione 15.3 e richiede almeno l'opzione del /std:c++17 compilatore.

Esempio

// Compile with /std:c++17

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

using namespace std;

map<int, string> m{ {1, "one"}, {2, "two"}, {10,"ten"} };
mutex mx;
bool shared_flag = true; // guarded by mx
int getValue() { return 42; }

int main()
{
    if (auto it = m.find(10); it != m.end())
    {
        cout << it->second << "\n";
    }

    if (int x = getValue(); x == 42)
    {
        cout << "x is 42\n";
    }

    if (lock_guard<mutex> lock(mx); shared_flag)
    {
        cout << "setting shared_flag to false\n";
        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";
    }
}

Output:

ten
x is 42
setting shared_flag to false
Error! Token must not be a keyword

se le istruzioni constexpr

A partire da C++17, è possibile usare un'istruzione if constexpr nei modelli di funzione per prendere decisioni di diramazione in fase di compilazione senza dover ricorrere a più overload di funzioni. Specifico di Microsoft: questo modulo è disponibile a partire da Visual Studio 2017 versione 15.3 e richiede almeno l'opzione del /std:c++17 compilatore.

Esempio

Questo esempio mostra come compilare in modo condizionale un modello in base al tipo inviato:

// Compile with /std:c++17
#include <iostream>

template<typename T>
auto Show(T t)
{
    //if (std::is_pointer_v<T>) // Show(a) results in compiler error for return *t. Show(b) results in compiler error for return t.
    if constexpr (std::is_pointer_v<T>) // This statement goes away for Show(a)
    {
        return *t;
    }
    else
    {
        return t;
    }
}

int main()
{
    int a = 42;
    int* pB = &a;

    std::cout << Show(a) << "\n"; // prints "42"
    std::cout << Show(pB) << "\n"; // prints "42"
}

L'istruzione if constexpr viene valutata in fase di compilazione e il compilatore genera solo il codice per il if ramo che corrisponde al tipo dell'argomento inviato al modello di funzione. Se si imposta come commento l'istruzione if constexpr e si annulla il commento, if il compilatore genera codice per entrambi i rami. Ciò significa che viene visualizzato un errore:

  • Se si chiama ShowValue(a); viene visualizzato un errore perché return *tt non è un puntatore, anche se l'istruzione if è false e il codice non viene mai eseguito.
  • Se si chiama ShowValue(pB); viene visualizzato un errore perché return tt è un puntatore, anche se l'istruzione if è true e il codice non viene mai eseguito.

L'uso if constexpr di risolve questo problema perché viene compilata solo l'istruzione corrispondente al tipo dell'argomento inviato al modello di funzione.

Output:

42
42

Vedi anche

Istruzioni di selezione
Parole chiave
switch Istruzione (C++)