c : char;qu'on peut traduire par << c est de type char >>, on a en C :
char c;qu'il faut traduire par << de type char est c >>, ce qui est une inversion peu naturelle. Ensuite, l'identificateur qui est le nom de l'objet déclaré, au lieu d'être mis en évidence dans la déclaration, est caché au beau milieu du déclarateur. Exemple :
char **p[10];
D'autre part, le langage C fait partie des langages qui permettent au programmeur, à partir de types de base et de constructeurs de type, de construire des types complexes. Du point de vue du programmeur, il existe dans le langage les constructeurs suivants :
Autre point ajoutant encore à la confusion, le constructeur * est un constructeur préfixé alors que les constructeurs [ ] et ( ) sont postfixé, et le constructeur * a une priorité différente de celle des deux autres. Ceci à la conséquence extrêmement désagréable, qu'un type complexe écrit en C ne peut pas se lire de la gauche vers la droite, mais peut nécessiter un analyse du type de celle que l'on fait pour comprendre une expression mathématique.
Par exemple, qui pourrait dire du premier coup d'il quel est le type de f dans la déclaration ci-dessous9.1 :
char (*(*f())[])()