Maison > développement back-end > C++ > Pourquoi l'analyse la plus fastidieuse de C interprète-t-elle mal les déclarations de variables comme des déclarations de fonctions ?

Pourquoi l'analyse la plus fastidieuse de C interprète-t-elle mal les déclarations de variables comme des déclarations de fonctions ?

Barbara Streisand
Libérer: 2024-12-01 13:12:12
original
291 Les gens l'ont consulté

Why Does C  's

L'analyse la plus vexante de C revisitée

Le tristement célèbre phénomène de "l'analyse la plus vexante" en C survient lorsqu'une déclaration apparemment anodine peut être interprétée sous forme de déclaration de fonction ou de déclaration de variable. Cela peut entraîner un comportement inattendu et des erreurs difficiles à déboguer.

Un exemple classique est l'extrait de code :

widget w( gadget(), doodad() );
Copier après la connexion

À première vue, cela semble être une déclaration de variable pour un widget nommé w avec un initialiseur entre parenthèses. Cependant, en y regardant de plus près, nous réalisons que gadget() et doodad() sont des appels de fonction, faisant de l'instruction une déclaration de fonction.

L'ambiguïté surgit parce que les arguments de fonction de type tableau se décomposent en pointeurs vers leur premier élément, tandis que les arguments de fonction de type fonction se désintègrent en pointeurs de fonction. Cela signifie que la signature de la fonction ci-dessus est en fait :

widget w( gadget(*)(), doodad(*)() );
Copier après la connexion

En d'autres termes, elle prend deux pointeurs de fonction comme arguments et renvoie un widget.

Des cas encore plus déroutants surviennent lorsque des variables sont impliqués :

widget w(gadget(x));
Copier après la connexion

Comme x est une variable, il semble impossible d'interpréter cela comme une déclaration de fonction. Cependant, C autorise des parenthèses supplémentaires dans les déclarations de variables. Ainsi, les deux gadgets x ; et gadget (x); déclarez la même variable x.

Par conséquent, le code ci-dessus pourrait être analysé comme une déclaration de fonction qui prend un seul argument de type gadget nommé x et renvoie un widget. Cela démontre l'importance de comprendre les subtilités de la syntaxe C pour éviter ces pièges subtils.

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!

source:php.cn
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal