J'ai lu quelque part que l'opérateur ?:
en C est légèrement différent en C ++, qu'il existe un code source qui fonctionne différemment dans les deux langages. Malheureusement, je ne trouve le texte nulle part. Est-ce que quelqu'un sait ce qu'est cette différence?
Réponses
Trop de publicités?L'opérateur conditionnel en C++ peut retourner une lvalue, alors que C n'autorise pas pour des fonctionnalités similaires. Par conséquent, la suite est légal en C++:
(true ? a : b) = 1;
Pour reproduire cela en C, vous devez avoir recours à des if/else, ou de traiter avec des références directement:
*(true ? &a : &b) = 1;
Aussi en C++, ?:
et =
des opérateurs ont la même priorité et le groupe de droite à gauche, de telle sorte que:
(true ? a = 1 : b = 2);
est valable de code C++, mais provoquera une erreur dans C sans parenthèses autour de l'expression dernière:
(true ? a = 1 : (b = 2));
La principale différence est que, dans C, l'évaluation de ?: ne peut jamais résulter en une l-value où comme en C++, il peut.
Il existe d'autres différences dans sa définition qui n'ont que peu de conséquences pratiques. En C++, le premier opérande est converti en booléen, en C il est comparé par rapport à 0. C'est comme pour la différence dans la définition de ==, !=, etc. entre le C et le C++.
Il y a aussi des règles plus complexes en C++ pour en déduire le type d'un ?: l'expression sur la base des types de la 2e et 3e opérandes. Cela reflète la possibilité de conversion implicite en C++.
Exemple de code. Valide en C++; invalide C.
extern int h(int p, int q);
int g(int x)
{
int a = 3, b = 5;
(x ? a : b) = 7;
return h( a, b );
}
gcc
génère l'erreur: "error: invalid lvalue dans l'affectation" lors de la compilation que le C, mais le code compile sans erreur lors de la compilation en C++.
Edit: Bien qu' ?: ne peut pas retourner une l-value en C, peut-être étonnamment, la grammaire ?: est:
conditional-expression:
logical-OR-expression
logical-OR-expression ? expression : conditional-expression
Cela signifie qu' a ? b : c = d
s'analyse comme (a ? b : c) = d
même si, à cause de la "pas une l-value" de la règle), ça ne peut pas entraîner une expression valide.
C++ changements de la grammaire à ceci:
conditional-expression:
logical-or-expression
logical-or-expression ? expression : assignment-expression
Alors que l'extension de permettre conditionnel expression doit être une l-value dans certaines situations auraient fait a ? b : c = d
valable sans la grammaire de changement, la nouvelle grammaire du changement signifie que l'expression est maintenant valide, mais avec les différents sens de l' a ? b : (c = d)
.
Bien que je n'ai pas de preuve de cela, je pense que comme la grammaire changement ne pouvait pas casser la compatibilité avec l'existant du code C, il était plus probable que la nouvelle grammaire serait de produire moins de surprises avec des expressions telles que:
make_zero ? z = 0 : z = 1;
Il existe une différence subtile dans la façon dont l'expression contenant un conditionnel (ou un opérateur ternaire) est analysée.
Veuillez vérifier la section "Notes" de la page http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B#Comparison_operators
à votre santé