En programmation C, quelle est la différence entre un nom_fonction et une variable?


Réponse 1:

Un nom de fonction est un nom que vous attribuez à une fonction que vous créez, qui peut occuper de 1 à plusieurs lignes de code. Une fonction peut recevoir de 0 à de nombreux paramètres; mais n'en renvoie qu'un.

Une variable est essentiellement nommée espace mémoire affecté à la réception et au stockage d'informations, qui peuvent également être transmises en tant que paramètre à une fonction. Normalement, vous supprimez les variables pour être d'un certain type: entier, chaîne, caractère, etc.


Réponse 2:
En programmation C, quelle est la différence entre un nom_fonction et une variable?

Ce sont deux choses totalement différentes.

Un nom de fonction (pas besoin de souligner, c'est juste une phrase) est le nom d'une fonction, déterminé lorsque la fonction est déclarée ou définie.

Une variable est - eh bien, ce n'est pas 100% clair ce qu'est une "variable" en C. La norme C n'utilise pas le mot "variable" dans le sens habituel. C définit le terme objet comme «région de stockage de données dans l'environnement d'exécution, dont le contenu peut représenter des valeurs». Un objet déclaré nommé peut raisonnablement être appelé une "variable", mais il n'y a pas de consensus sur ce qu'est exactement ou non une "variable".

Une fonction peut être appelée. Un objet peut contenir des valeurs.


Réponse 3:

La principale différence est que la fonction associée à un nom de fonction est automatiquement configurée par le compilateur. En C, les fonctions ne sont pas des «objets de première classe» - vous ne pouvez pas les transmettre à des fonctions qui les modifieront / les combineront et les rendront comme vous le pouvez avec des nombres ou des chaînes de caractères).

les variables contiennent les valeurs des objets de première classe (entiers, caractères, nombres flottants, etc. Vous pouvez avoir un pointeur vers une fonction et c'est un objet de première classe que vous pouvez stocker et transmettre / renvoyer à partir de fonctions (et utiliser pour appeler , mais vous ne pouvez pas modifier la «valeur» de la fonction elle-même au moment de l'exécution, comme vous pouvez le faire avec des objets de première classe.

Ils ressemblent donc à peu près aux variables, mais la seule chose que vous pouvez faire avec eux, à part prendre leur adresse, c'est les appeler. Vous ne pouvez pas dire main = {quelque chose…}, il vous suffit de définir une fonction principale et de laisser le compilateur faire l'association du nom et du code dans les coulisses.

Les langages comme Haskell, où vous pouvez définir la valeur des fonctions au moment de l'exécution, sont appelés langages «fonctionnels» pour cette raison. Un exemple simple serait une fonction appelée make tax adder, à laquelle vous transmettez un taux de taxe et qui renvoie une fonction qui ajoutera un taux de taxe fixe aux éléments qui lui sont passés:

addstatetax = maketaxadder (.05)

addlocaltax = maketaxadder (.015)

ici, nous avons créé 2 fonctions au moment de l'exécution qui peuvent être appelées par exemple addstatetax (100) renverra 105 tandis que addlocaltax (100) renverra 101,50.

la variable addstatetax a la «valeur» d'une fonction qui prend un nombre et en retourne un autre avec 5% ajoutés. Vous pouvez faire des choses similaires en C avec des structures et des pointeurs de fonction, mais c'est beaucoup plus difficile (la définition des types de pointeurs de fonction en C est notoirement difficile) et plus sujette aux erreurs.


Réponse 4:

Un nom de fonction est essentiellement un pointeur, vous pouvez donc faire quelque chose comme: void (* func) (int); func = myVoidFunc; // ou alternativementfunc = & myVoidFunc;

et c'est vraiment la principale différence. Lorsque vous travaillez avec un pointeur normalement, il importe beaucoup que vous utilisiez ou non l'opérateur d'adresse de (esperluette), comme:

int * ptr = myVar; // andint * ptr = & myVar;

entraînera presque certainement un comportement très différent, mais à part cela, les noms de fonction ne sont en fait que des pointeurs, du moins c'est ainsi que je le vois. Je suis sûr d'entrer dans les détails, je n'ai aucun sens, mais de votre point de vue, et le mien, je suis sûr que ça va le faire.

Une autre différence est bien sûr que vous ne pouvez pas déférer un nom de fonction, vous ne pouvez pas faire d'arithmétique de pointeur dessus, ou du moins si vous le pouvez, c'est extrêmement dangereux, et ainsi de suite.