« Programmation C/Opérateurs » : différence entre les versions

Contenu supprimé Contenu ajouté
→‎Les opérateurs du C : Correction d'une faute d'orthographe.
Ligne 9 :
* Les '''instructions''' : manipulent les expressions pour leur donner une signification particulière (test, boucle, saut, ...).
 
Les déclarations de variables ont en partie été décrites dans les chapîtreschapitres précédents. Les expressions seront en partie décrites dans celui-ci (les opérateurs liés aux pointeurs, tableaux, structures et fonctions seront décrit dans des chapitres dédiés), et les instructions seront décrites au cours des chapitres suivants.
 
Les expressions en C sont en fait très génériques, elles peuvent inclure des opérations arithmétiques classiques (addition, soustraction, division, modulo, ...), des expressions booléennes (OU logique, ET logique, OU exclusif, ...), des comparaisons (égalité, inégalité, différence, ...) et même des affectations (copie, auto-incrément, ...). Toutes ces opérations peuvent s'effectuer en une seule expression, il suffit d'appliquer les bons opérateurs sur les bons opérandes.
Ligne 15 :
Les opérateurs binaires et ternaires utilisent une notation infixe (l'opérateur se trouve entre les 2 ou 3 opérandes). Les opérateurs unaires s'écrivent de manière préfixé (avant l'opérande), à l'exception des opérateurs <code>++</code> et <code>--</code> qui peuvent s'écrire de manière préfixée ou postfixée (avec une différence subtile, décrite ci-après).
 
La '''priorité''' (quel opérateur est appliqué avant, en l'absence de parenthésageparenthèses explicite) et l'<b>associativité</b> (dans quel ordre sont traités les arguments des opérateurs ayant la même priorité) sont résumées dans la table suivante (par ordre décroissant de priorité - les opérateurs décrits dans un autre chapitre ont un lien dédié)&nbsp;:
 
{| cellpadding="5" cellspacing="0" style="border:thin black solid"
Ligne 143 :
C'est un concept quelque peu sibyllin du C. Incrémenter ou décrémenter de un est une opération extrêmement courante. Écrire à chaque fois '<code>variable = variable + 1</code>' peut-être très pénible à longue. Le langage C a donc introduit des opérateurs raccourcis pour décrémenter ou incrémenter n'importe quel type atomique (gérable directement par le processeur : c'est à dire pas un tableau, ni une structure ou une union). Il s'agit des opérateurs '<code>++</code>' et '<code>--</code>', qui peuvent être utilisés de manière préfixée ou postfixée (avant ou après la variable).
 
Utilisé de manière préfixée, l'opérateur modifie d'abord la variable, puis utilise cette nouvelle valeur dans l'expression, tandis qu'écriteutilisé de manière postfixée, la valeur de la variable n'est modifiée qu'à la fin de l'expression, qui utilise donc la valeur courante de la variable. Exemples :
 
<source lang="c">
Ligne 164 :
 
=== Promotion entière ===
La promotion entière, à ne pas confondre avec la conversion automatique de type, fait que tous les types plus petits ou égaux à <code>int</code> (<code>char</code>, <code>short</code>, champs de bits, type énuméré) sont convertis (promus) en <code>int</code> ou <code>unisgnedunsigned</code> avant toute opération. Ainsi, dans l'exemple suivant, <code>a + b</code> est calculé avec des <code>int</code> et le résultat est de type <code>int</code> :
<source lang="c">
short sum(short a, short b) {
Ligne 177 :
La conversion est un mécanisme qui permet de convertir implicitement les nombres dans le format le plus grand utilisé dans l'expression.
 
L'exemple classique est lorsqu'onle mélange des nombres réels avec des nombres entiers. Par exemple l'expression '<code>2 / 3.</code>' est de type double et vaudra effectivement deux tiers (0,666666...). L'expression '<code>2 * a / 3</code>' calculera les deux tiers de la variable '<code>a</code>', et arrondira automatiquement à l'entier par défaut, les calculs ne faisant intervenir que des instructions sur les entiers (en supposant que '<code>a</code>' soit un entier). À noter que l'expression '<code>2 / 3 * a</code>' vaudra... toujours zéro !
 
Plus subtile, l'expression '<code>2 * a / 3.</code>', en supposant toujours que ''a'' soit un entier, effectuera une multiplication entière entre 2 et a, puis promouvra le résultat en réel (<code>double</code>) puis effectuera la division réelle avec trois, pour obtenir un résultat réel lui-aussi.
Ligne 264 :
</source>
 
Une autre technique classique, lorsqu'une comparaison fait intervenir une constante, est de mettre la constante à gauche. De cette manière, si la comparaison se transforme par mégarde en affectation, cela provoquraprovoquera une erreur à la compilation&nbsp;:
 
<source lang="c">