? : est l'opérateur conditionnel ou opérateur ternaire (ternary).
cond ? a : b est une expression, qui vaut a si cond est vrai, et b sinon.
L'avantage, c'est que c'est une expression, que tu peux utiliser comme argument d'une fonction.
Par exemple, au lieu d'écrire:
1 2 3 4 5 6
| int status;
if ( show_debug_messages ) {
status = interpreteur.execute_commande(commande, contexte, Interpreteur::trace_debug);
} else {
status = interpreteur.execute_commande(commande, contexte, Interpreteur::trace_info);
} |
Tu peux écrire:
const int status = interpreteur.execute_commande(commande, contexte, (show_debug_messages ? Interpreteur::trace_debug : Interpreteur::trace_info);
Nul besoin de recopier du code (et risquer une faute de copie, maintenant, ou en corrigeant un bug, plus tard), et la variable peut être déclarée constante, puisqu'elle est initialisée immédiatement.
Dans les détails, les deux parties "résultats" doivent être de type similaire, et une seule de ces deux parties est évaluée.
Ainsi, il n'y a pas d'erreur avec int valeur = (pointeur ? pointeur->valeur : 0);. Si pointeur est nul, il est équivalent à false, et pointeur->valeur n'est même pas appelée.
Partager