A la programació C, quina diferència hi ha entre un nom_funció i una variable?


Resposta 1:

Un nom de funció és un nom que assigneu a una funció que creeu, que pot ocupar entre 1 i moltes línies de codi. Una funció pot rebre de 0 a molts paràmetres; però només en retorna un.

Una variable s'anomena bàsicament espai de memòria assignat per rebre i emmagatzemar informació, que també es pot passar com a paràmetre a una funció. Normalment, les diferències són un tipus determinat: nombres enters, cadenes, caràcters, etc.


Resposta 2:
A la programació C, quina diferència hi ha entre un nom_funció i una variable?

Són dues coses completament diferents.

Un nom de funció (sense necessitat de guió baix, és només una frase) és el nom d’una funció determinada quan es declara o es defineix la funció.

Una variable és, bé, no està clar al 100% què és una "variable" a C. L'estàndard C no utilitza la paraula "variable" en el sentit habitual. C defineix el terme objecte com a “regió d’emmagatzematge de dades a l’entorn d’execució, el contingut del qual pot representar valors”. Un objecte declarat es pot dir raonablement com a "variable", però no hi ha consens sobre què és o no exactament una "variable".

Es pot cridar una funció. Un objecte pot contenir valors.


Resposta 3:

La diferència principal és que el compilador configura automàticament la funció associada a un nom de funció. A C, les funcions no són "objectes de primera classe": no les podeu passar a funcions que les podran modificar / combinar i retornar-les com podeu amb números o cadenes de caràcters).

Les variables contenen els valors d'objectes de primera classe (nombres enters, caràcters, números flotants, etc. Podeu tenir un punter a una funció i aquest és un objecte de primera classe que podeu emmagatzemar i passar / tornar de funcions (i fer servir per trucar a la funció), però no podeu canviar el "valor" de la funció en temps d'execució, tal com es pot fer amb objectes de primera classe.

Així que semblen gairebé iguals a les variables, però l’únic que podeu fer amb elles, a part d’agafar la seva adreça, és trucar-les. No podeu dir principal = {alguna cosa ...}, només heu de definir una funció principal i deixar que el compilador faci l’associació del nom i el codi que hi ha al darrere.

Per aquest motiu, idiomes com Haskell, on podeu definir el valor de les funcions en temps d'execució, s'anomenen llenguatges "Funcionals". Un exemple senzill seria la funció anomenada "adder fiscal", a la qual passa un tipus impositiu i retorna una funció que afegeix un tipus d'impost fix als articles que li passin:

addstatetax = maketaxadder (.05)

addlocaltax = maketaxadder (.015)

aquí hem creat 2 funcions en temps d'execució que es poden anomenar, per exemple, addstatetax (100) retornarà 105 mentre que addlocaltax (100) retornarà 101,50.

la variable addstatetax té el "valor" d'una funció que pren un número i en torna una altra amb un 5% afegit. Podeu fer coses similars en C amb estructures i indicadors de funcions, però és molt més difícil (definir els tipus de punter de funció en C és notòriament dur) i més propens a errors.


Resposta 4:

Un nom de funció és essencialment un punter, de manera que podeu fer alguna cosa així com: void (* func) (int); func = myVoidFunc; // o alternativelyfunc = & myVoidFunc;

i aquesta és la diferència principal. Si es treballa normalment amb el punter, és important si utilitzeu o no l’operador d’adreça de (ampersand), com ara:

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

gairebé segur que tindran lloc en un comportament molt diferent, però a banda, els noms de funcions són realment només apunts, almenys així ho veig. Estic segur que entraré en detalls no tinc cap sentit, però des de la vostra perspectiva i la meva, estic segur que ho farà.

Una altra diferència és, per descomptat, que no es pot deferir un nom de funció, no es pot fer una aritmètica de punter sobre ella o, si més no, si és extremadament perillós, etcètera.