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() );
À 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(*)() );
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));
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!