Maison >développement back-end >C++ >Quelle est 'l'analyse la plus fastidieuse' de C et comment peut-elle induire en erreur les déclarations de fonctions ?
L'analyse la plus vexante de C
En C, la façon dont un extrait de code est analysé peut conduire à un comportement inattendu. Un exemple tristement célèbre est connu sous le nom de « l'analyse la plus vexante ».
L'énigme des déclarations de fonction
Considérez le code suivant :
widget w(gadget(), doodad());
À première vue, il semble déclarer une variable nommée w de type widget. Cependant, ce code définit en fait une fonction nommée w qui prend deux arguments.
Argument Decay et Pointer Casting
Dans une déclaration de fonction, les arguments de type tableau se décomposent en pointeurs au premier élément, et les arguments de type fonction se désintègrent en pointeurs de fonction. Ainsi, la déclaration équivalente de w est :
widget w(gadget(*)(), doodad(*)());
Cela signifie que la fonction w prend comme premier argument un pointeur vers une fonction qui ne prend aucun argument et renvoie un gadget. Il prend également un deuxième argument, un pointeur vers une fonction qui ne prend aucun argument et renvoie un gadget. La fonction elle-même renvoie un widget.
Complexités supplémentaires
L'analyse la plus fastidieuse devient encore plus déroutante dans des cas comme les suivants :
widget w(gadget(x));
Si x est déjà une variable, comment cela peut-il être interprété comme une déclaration de fonction ? La réponse réside dans le fait qu'en C , vous pouvez utiliser des parenthèses supplémentaires lors de la déclaration des variables. Ainsi, le gadget x ; et gadget (x); les deux déclarent la même variable nommée x. Le code ci-dessus est donc une déclaration d'une fonction qui prend un premier argument de type gadget nommé x, et renvoie un widget.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!