9
votes

& Opérateur facultatif en fonction de l'affectation du pointeur de fonction

Dans le code suivant: xxx

dans la ligne xxx

J'ai remarqué que le unaire et (adresse de) opérateur est facultatif et le programme compile et exécute de la même manière avec ou sans elle (sous Linux avec GCC 4.2.4). Pourquoi? Est-ce une question spécifique au compilateur, ou peut-être deux normes de langue différentes étant acceptées par le compilateur? Merci.


2 commentaires

BTW- Est-ce que tout cela signifie qu'un pointeur de fonction "se comporte de la même manière" qu'une référence à la fonction se comporterait?


@Kos: Il peut sembler de se comporter de la même manière au niveau du code source, bien que la similitude soit purement superficielle: la mécanique de la langue abstraite sous-jacente est plutôt différente. Pourtant, si vous creusez même plus profondément et regardez la mécanique de la machine, vous verrez qu'ils semblent être la même.


4 Réponses :


14
votes

Vous êtes correct que le & est facultatif. Les fonctions, comme des tableaux, peuvent être automatiquement converties en pointeurs. Ce n'est ni spécifique au compilateur ni le résultat de normes de langue différentes. Du niveau standard, Section 6.3.2.1 , paragraphe 4:

a la fonction de fonction est une expression qui a un type de fonction. Sauf lorsqu'il s'agit de l'opérande de Tailleof OPLUT OU LA UNIERNE Opérateur, un concepteur de fonction avec type " Fonction renversement type "est converti en une expression de type" pointeur pour fonctionner de retourner type ". ".


4 commentaires

J'ai également été évanouis, j'ai une forte soupçon c'était des bowvotes rivaux ... voici une indemnité de moi


@Armen Tsirunyan: les statistiques "de la rivalité" ne montrent pas assez de bowvotes pour lui faire le coupable. Ce qui me met apparemment sous la suspicion :) Mais je ne l'ai pas fait! Doit être des bowvotes de troll.


@Andreyt: Je suis désolé d'assumer à la hâte un bowvote rival. J'étais évidemment tort. Ce doit être la frustration qui parle :)


@Andreyt, @armen: Je n'ai pas été évité, mais comme vous l'avez remarqué, j'ai trop peu de bowvotes pour être coupable. C'est une mise en place! Je peux prouver mon innocence!



7
votes

répondant à C ++. Pour C, les mêmes conservent

Devis de la norme C ++ (4.3.1):

Un lvalue de type de fonction T peut être converti en une rvalue de type "Pointeur à T." Le résultat est un pointeur sur la fonction.50)

la même chose pour les tableaux. (4.2.1)

Un lvalue ou rvalue de type "Array ofn T "ou" gamme de liaison inconnue de T " peut être converti en une rvalue de type "Pointeur à T." Le résultat est un pointeur sur le premier élément de la Array.

Mais veuillez noter que ce sont des conversions et en aucun moyen est une fonction un pointeur de fonction ou un tableau un pointeur. Htth


0 commentaires

5
votes

de la norme (6.3.2.1/4):

a la fonction de fonction est une expression qui a type de fonction. Sauf quand il est l'opérande de la taille de opérateur ou l'opérateur unaire et l'opérateur, un Concepteur de fonction avec type '' Fonction de retour de retour '' est converti en une expression qui a Tapez '' pointeur pour fonctionner Tapez '' .

Alors oui, omettez le & donne un pointeur pour fonctionner quand même.


0 commentaires

13
votes

opérateur & est en effet facultatif lors de la prise de l'adresse d'une fonction dans votre contexte (attribuant quelque chose à quelque chose). Ce n'est pas spécifique au compilateur, il résulte de la définition formelle de la langue.

symétriquement, opérateur * est facultatif lors de l'appel de la fonction via un pointeur. Dans votre exemple, vous pouvez appeler la fonction comme (* logfunc) (n) ou logfunc (n) . Vous avez utilisé ce dernier, mais le premier fonctionnerait aussi.


0 commentaires