Priorité et ordre d'évaluation
La priorité et l'associativité des opérateurs C affectent le regroupement et l'évaluation des opérandes dans des expressions.Une priorité d'opérateur est significative uniquement si d'autres opérateurs avec par d'une priorité supérieure ou inférieure sont.Les expressions avec des opérateurs de haut-priorité sont évaluées en premier.La priorité peut également être décrite par le mot « de la liaison. » L'on dit que les opérateurs avec une priorité plus élevée ont une liaison plus stricte.
Le tableau suivant résume la priorité et l'associativité (l'ordre dans lequel les opérandes sont évalués) des opérateurs C, les répertoriant par ordre de priorité la plus élevée à la plus faible.Lorsque plusieurs opérateurs apparaissent ensemble, ils ont la priorité égale et sont évalués selon leur associativité.Les opérateurs dans le tableau sont décrits dans les sections en commençant par opérateurs de suffixe.Le reste de cette section fournit des informations générales à propos de précédence et d'associativité.
Niveau de précédence et d'associativité des opérateurs C
Symbol1 |
type d'opération |
Associativité |
---|---|---|
[ ] ( ) . - Suffixe++ d'> et le suffixe -- |
Expression |
De gauche à droite |
préfixe ++ et préfixe -- sizeof & * + (~ ! |
Unaire |
De droite à gauche |
convertit le type |
Unaire |
De droite à gauche |
* / % |
Multiplicative |
De gauche à droite |
+ – |
Additive |
De gauche à droite |
<< >> |
décalage de bits |
De gauche à droite |
< > <= >= |
relationnel |
De gauche à droite |
== != |
Égalité |
De gauche à droite |
& |
Opérateur de bits AND |
De gauche à droite |
^ |
De bits-exclusivité-OU |
De gauche à droite |
| |
De bits-inclus-OU |
De gauche à droite |
&& |
AND |
De gauche à droite |
|| |
de |
De gauche à droite |
?: |
expression conditionnelle |
De droite à gauche |
= *= /= %= += - = <<= >>=&= ^= |= |
Assignment2 simple et composite |
De droite à gauche |
, |
évaluation séquentielle |
De gauche à droite |
1.Les opérateurs sont répertoriés dans l'ordre décroissant de priorité.si plusieurs opérateurs apparaissent sur la même ligne ou à un groupe, ils ont la priorité égale.
2.tous les opérateurs simples et d'assignation composée ont la priorité égale.
une expression peut contenir plusieurs opérateurs avec la priorité égale.Lorsque plusieurs ces opérateurs apparaissent au même niveau dans une expression, l'évaluation se poursuit selon l'associativité de l'opérateur, de droite à gauche ou de gauche à droite.La direction de l'évaluation n'affecte pas les résultats des expressions comprenant plusieurs multiplication (*), l'ajout (+), ou l'opérateur binaire-de bits (& | ^) au même niveau.L'ordre des opérations n'est pas définie par le langage.Le compilateur peut évaluer de ces expressions dans n'importe quel ordre, si le compilateur peut garantir un résultat cohérent.
Seule la séquentiel-évaluation (,), logique AND (&&), de (||), expression conditionnelle (? :), et les opérateurs d'appel de fonction constituent des points de séquence et garantissent par conséquent un ordre particulier d'évaluation pour leurs opérandes.L'opérateur d'appel de fonction est l'ensemble des parenthèses qui suit l'identificateur de fonction.L'opérateur de séquentiel-évaluation (Serveur IIS local) est assuré d'évaluer ses opérandes de gauche à droite.(Notez que l'opérateur virgule dans un appel de fonction n'est pas le même que l'opérateur de séquentiel-évaluation et ne fournit pas une telle garantie.) Pour plus d'informations, consultez points de séquence.
les opérateurs logiques garantissent également l'évaluation de leurs opérandes de gauche à droite.Toutefois, ils évaluent le plus petit nombre d'opérandes nécessaires pour déterminer le résultat de l'expression.Cette opération est appelée « évaluation de court-circuit ».Par conséquent, certaines opérandes de l'expression ne peuvent être évalués.par exemple, dans l'expression
x && y++
le deuxième, y++, est évaluée uniquement si x est vraie (une valeur différente de zéro).Ainsi, y n'est pas incrémenté si x a la valeur false (0).
Exemples
La liste suivante montre comment le compilateur lie automatiquement plusieurs exemples d'expressions :
Expression |
liaison automatique |
---|---|
a & b || c |
(a & b) || c |
a = b || c |
a = (b || c) |
q && r || s-- |
(q && r) || s–– |
Dans la première expression, l'opérateur de bits AND (&) a une priorité plus élevée que l'opérateur OR logique (||), ce a & b forme le premier opérande de l'opération logique OR.
Dans la deuxième expression, l'opérateur OR logique (||) a une priorité plus élevée que l'opérateur de simple-devoir (=), afin qu'un b || c est regroupé comme opérande droit dans l'assignation.notez que la valeur assignée à a est 0 ou 1.
La troisième expression montre une expression correcte qui peut produire un résultat inattendu.Opérateur AND logique (&&) a une priorité plus élevée que l'opérateur OR logique (||), afin qu'un q && r est regroupé comme opérande.Étant donné que les opérateurs logiques garantissent l'évaluation des opérandes de gauche à droite, q && r est évalué avant s––.Toutefois, si q && r prend une valeur différente de zéro, s–– n'est pas évaluée, et s n'est pas décrémenté.Si non décrémenter s produirait un problème dans votre programme, s–– doit apparaître comme premier opérande de l'expression, ou s doit être décrémenté dans une opération distincte.
L'expression suivante est non conforme et produit un message de diagnostic au moment de la compilation :
Expression non conforme |
regroupement par défaut |
---|---|
p == 0 ? p += 1: p += 2 |
( p == 0 ? p += 1 : p ) += 2 |
Dans cette expression, l'opérateur d'égalité (==) a la priorité la plus élevée, ce p == 0 est regroupé comme opérande.L'opérateur d'expression conditionnelle (? :) a la priorité NeXT-plus élevée.Son premier opérande est p == 0, et son deuxième est p += 1.Toutefois, le dernier opérande de l'opérateur d'expression conditionnelle est considéré comme p plutôt qu' p += 2, étant donné que cette occurrence d' p la lie plus étroitement à l'opérateur d'expression conditionnelle qu'elle définit l'opérateur d'assignation composée.Une erreur de syntaxe se produit car += 2 n'a pas un opérande gauche.Vous devez utiliser des parenthèses pour éviter les erreurs de ce code plus lisible de type et de produit.Par exemple, vous pouvez utiliser des parenthèses comme indiqué ci-dessous pour corriger et clarifier l'exemple précédent :
( p == 0 ) ? ( p += 1 ) : ( p += 2 )