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 ?

Quelle est 'l'analyse la plus fastidieuse' de C et comment peut-elle induire en erreur les déclarations de fonctions ?

Barbara Streisand
Libérer: 2024-11-24 13:22:12
original
590 Les gens l'ont consulté

What's C  's

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());
Copier après la connexion

À 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(*)());
Copier après la connexion

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));
Copier après la connexion

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!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal