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

Contenu supprimé Contenu ajouté
Ligne 13 :
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.
 
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éesuffixée (avec une différence subtile, décrite ci-après).
 
La '''priorité''' (quel opérateur est appliqué avant, en l'absence de parenthè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;:
Ligne 141 :
=== Post/pré incrémentation/décrémentation ===
 
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éesuffixée (avant ou après la variable).
 
Utilisé de manière préfixée, l'opérateur incrémente/décrémente la variable, puis retourne la valeur de celle-ci. En fait, les expressions <code>(++E)</code> et <code>(--E)</code> sont équivalentes respectivement aux expressions <code>(E+=1)</code> et <code>(E-=1)</code>.
 
Par contre, utilisé de manière postfixéesuffixée, l'opérateur retourne la valeur originale avant de modifier la valeur de la variable.
 
<source lang="c">
Ligne 252 :
</source>
 
Dans cet exemple, il y a un seul caractère <code>=</code> entre <code>a</code> et <code>b</code>, donc on ne teste pas si <code>a</code> est égal à <code>b</code>, mais on '''affecte''' la valeur de la variable <code>b</code> à la variable <code>a</code>. Le résultat de l'expression étant 2, elle est donc toujours considérée vraie. Ce genre de raccourci est en général à éviter. En effet, il est facile de faire une faute de frappe et d'oublier de taper un caratèrecaractère <code>=</code>. Comme le code résultant est toujours valide au sens du C, cette erreur peut ne pas être vue immédiatement. Pour aider les développeurs à détecter ce genre d'erreurs, de nombreux compilateurs émettent un avertissement quand un tel code leur est présenté. Une manière de faire taire ces avertissements, ''une fois qu'on s'est assuré qu'il ne s'agit pas d'une erreur'', est de parenthésermettre entre parenthèses l'affectation:
 
<source lang="c">
/* On veut faire une affectation ici. */
/* doubledoublement parenthésagedes parenthèses pour supprimer l'avertissement du compilateur*/
if ((a = b))
{