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-seq
optare decl-specifier-seq
declarator
brace-or-equal-initializer
statement
:
expression-statement
compound-statement
expression-statement
:
expression
optare ;
compound-statement
:
{
statement-seq
optare }
statement-seq
:
statement
statement-seq
statement
if-branch
:
statement
else-branch
:
statement
selection-statement
:
if
constexpr
opt17 opt17 (
init-statement
condition
)
if-branch
if
constexpr
opt17 opt17 (
init-statement
condition
)
if-branch
else
else-branch
17 Questo elemento facoltativo è disponibile a partire da C++17.
Istruzioni if-else
In tutte le forme dell'istruzione if
, condition
che 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 break
oggetto , continue
o 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 *t
t
non è un puntatore, anche se l'istruzioneif
è false e il codice non viene mai eseguito. - Se si chiama
ShowValue(pB);
viene visualizzato un errore perchéreturn t
t
è un puntatore, anche se l'istruzioneif
è 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++)