10

Les Pieges du C



Les Noms des Variables :

Voici quelques noms corrects :

Et quelques noms incorrects :


L'Ordre des Opérateurs :

Lorsque plusieurs opérateurs apparaissent dans une même expression, il est nécessaire de savoir dans quel ordre ils sont mis en jeu. En C, comme dans les autres langages, les règles de priorité sont "naturelles" et rejoignent celles de l'algèbre traditionnelle.
L'opérateur unaire - (opposé) a la priorité la plus élevée. On trouve ensuite, à un même niveau, les opérateurs *, / et %. Enfin, sur un dernier niveau, apparaissent les opérateurs binaires + et -.
En cas de priorités identiques, les calculs s'effectuent de gauche à droite.
Dans les quelques exemples suivants, les expressions à droite comportent des parenthèses superflues, et sont équivalentes aux expressions de gauche.


La Notation Décimale :

La notation décimale comporte un point (correspondant à notre virgule). La partie entière ou la partie décimale peuvent être omises (mais, bien sûr, pas toutes les deux en même temps !).

En voici quelques exemples corrects :

La notation exponentielle utilise la lettre e (ou E) pour introduire un exposant entier (puissance de 10), avec ou sans signe.

Voici quelques exemples corrects (les exemples d'une même ligne étant équivalents) :


Erreur à Eviter sur le "if" ou sur le "if ... else" :

Considérons une situation telle que :

La première ligne ne pose aucun problème : le compilateur détecte le début d'une instruction if. Comme à la suite de la condition il ne trouve pas de bloc d'instructions, il sait que la partie correspondant au cas VRAI ne comporte qu'une instruction. A la suite du premier printf, il ne trouve pas de mot else : il en conclut donc que l'instruction if s'achève là, autrement dit qu'elle ne comporte pas de else. L'instruction max=b; ne lui pose pas de problème particulier. En revanche, à la rencontre du else, le compilateur ne peut l'attribuer à aucune instruction if et il signale une erreur. Il aurait fallu écrire :


Erreur à Eviter sur le "==" :

L'opérateur relationnel "= =", servant à tester l'égalité de deux expressions, ne doit pas être confondu avec l'opérateur d'affectation "=".

Il ne faut pas écrire :

Car lorsque le compilateur va évaluer l'expression a=3, il va d'abord affecter 3 à a, et le résultat de cette affectation sera toujours vrai. Donc "a=3" est toujours évalué à VRAI.

Il faut donc écrire :


Erreur à Eviter sur le Compteur du "for" :

Il faut veiller à ne pas utiliser la variable qui sert de compteur au for à l'intérieur du bloc d'instructions de ce for.


Les commentaires

Il est possible de mettre n'importe quel signe entre les délimitateurs a l'exception du délimitateur de fin de commentaires */

Exemple de commentaire faux :


Le main()

La fonction main() ainsi que toutes les instructions du C ont besoins d'être écrites en minuscule

Exemples de fautes :


Opérateurs d'incrémentation et de décrémentation

Les opérateurs d'incrémentation (++) et de décrémentation (--) peuvent être placés avant ou après la variable à incrémenter (ou a décrémenter ).

Un opérateur de post-incrémentation ou de post-décrémentation entraîne que son opérande est d'abord utilisée, puis seulement alors incrémentée ou décrémentée.

Inversement :

Un opérateur de pré-incrémentation ou de pré-décrémentation entraîne que son opérande est incrémentée ou décrémentée avant d'être utilisée.

Exemple :

Valeur de x Valeur de y Instruction Valeur de x après instruction Valeur de y après instruction
x=1 y=0 y=x++ x=2 y=1
x=1 y=0 y=x-- x=0 y=1
x=1 y=0 y=++x x=2 y=2
x=1 y=0 y=--x x=0 y=0


& et | ne sont pas && ou ||

Il est courant de substituer par inadvertance = par ==, car tant d'autres langages utilisent = pour les comparaisons. De même qu'il est facile d'échanger & et &&, ou | et ||, surtout parce que les opérateurs & et | en C sont différents de leurs équivalents dans d'autres langages.


Convention sur le vrai et le faux

Une expression est estimée fausse si elle vaut 0, et est estimée vraie pour toute autre valeur.

Exemple :

-17654        -12          -1              1              23           263846      sont estimées VRAI car elles sont différentes de 0

seul 0 est estimé FAUX, car seule la valeur 0 correspond à une expression fausse.