Priorite
Vous avez peut être vu cette construction
int main (int argc, char *argv[]) {
}
Selon la manière dont la priorité s’applique *argv[] peut être lu de deux
manières. Admettons que nous compilions vers une architecture 64 bits avec
des pointeurs codés sur 8 octets : dans le cas où le pointeur s’applique
avant le tableau char (*argv)[] argv serait un pointeur (de 8 octets) pointant
sur un tableau de caractères (dont chaque élément est un char et dont l’arithmétique
serait de base 1). Si le tableau a une plus grande priorité que le pointeur
char *(argv[]), argv serait un tableau (convertible en pointeur de 8 octets) dont
chaque élément est un pointeur, et l’arithmétique sur un tel tableau serait de base 8.
Concrètement argv[1] lirait à un octet après l’adresse de argv dans le premier cas et à 8 octets à l’adresse de argv dans le seond cas.
Voila une des raison pourquoi connaitre “par coeur” la priorité des opérateurs en C peut etre utile. Dans du code industriel
on peut aussi rendre obligatoire l’utilisation de paranthèses lorsque
deux opérateurs ou plus cohabitent dans la même expression : c’est à dire
que a = a + a * 2 ne serait pas autorisé, il faudrait écrire a = (a + (a * 2))
même si cela peut paraitre évident pour un développeur C expérimenté.
Voilà les règles de priorité à connaitre :
En conséquence vous pouvez reconnaitre d’un coup d’oeil que char * const (*(* const bar)[5])(int ) déclare bar comme un pointeur constant vers un tableau de 5 pointeurs sur des fonctions acceptants un int et retournants un pointeur constant vers char. Pour vous aider, vous pouvez utiliser le site
https://cdecl.org
🌍⤴