Was ist der Unterschied zwischen einem Funktionsnamen und einer Variablen in der C-Programmierung?


Antwort 1:

Ein Funktionsname ist ein Name, den Sie einer von Ihnen erstellten Funktion zuweisen, die 1 bis viele Codezeilen belegen kann. Eine Funktion kann 0 bis viele, viele Parameter empfangen. gibt aber nur einen zurück.

Eine Variable wird im Wesentlichen als Speicherbereich bezeichnet, der zum Empfangen und Speichern von Informationen zugewiesen ist und der auch als Parameter an eine Funktion übergeben werden kann. Normalerweise werden Variablen auf einen bestimmten Typ festgelegt: Ganzzahl, Zeichenfolge, Zeichen usw.


Antwort 2:
Was ist der Unterschied zwischen einem Funktionsnamen und einer Variablen in der C-Programmierung?

Das sind zwei völlig verschiedene Dinge.

Ein Funktionsname (der Unterstrich ist nicht erforderlich, es handelt sich lediglich um eine Phrase) ist der Name einer Funktion, der beim Deklarieren oder Definieren der Funktion festgelegt wird.

Eine Variable ist - na ja, es ist nicht 100% klar, was eine "Variable" in C ist. Der C-Standard verwendet das Wort "Variable" nicht im üblichen Sinne. C definiert den Begriff Objekt als "Bereich der Datenspeicherung in der Ausführungsumgebung, dessen Inhalt Werte darstellen kann". Ein benanntes deklariertes Objekt kann vernünftigerweise als "Variable" bezeichnet werden, es besteht jedoch kein Konsens darüber, was genau eine "Variable" ist oder nicht.

Eine Funktion kann aufgerufen werden. Ein Objekt kann Werte enthalten.


Antwort 3:

Der Hauptunterschied besteht darin, dass die mit einem Funktionsnamen verknüpfte Funktion vom Compiler automatisch eingerichtet wird. In C sind Funktionen keine „erstklassigen Objekte“ - Sie können sie nicht an Funktionen übergeben, mit denen sie geändert / kombiniert und wie mit Zahlen oder Zeichenfolgen zurückgegeben werden.

Variablen enthalten die Werte von erstklassigen Objekten (Ganzzahlen, Zeichen, Gleitkommazahlen usw.). Sie können einen Zeiger auf eine Funktion haben, und das ist ein erstklassiges Objekt, das Sie speichern und übergeben / von Funktionen zurückgeben können (und zum Aufrufen von Funktion), aber Sie können den „Wert“ der Funktion selbst zur Laufzeit nicht ändern, wie Sie es bei erstklassigen Objekten tun.

Sie sehen also so ziemlich so aus wie Variablen, aber das einzige, was Sie mit ihnen tun können, außer ihre Adresse zu nehmen, ist sie aufzurufen. Sie können nicht main = {something…} sagen, Sie müssen nur eine Hauptfunktion definieren und den Compiler die Zuordnung des Namens und des Codes hinter den Kulissen vornehmen lassen.

Sprachen wie Haskell, in denen Sie den Wert von Funktionen zur Laufzeit definieren können, werden aus diesem Grund als "funktionale" Sprachen bezeichnet. Ein einfaches Beispiel wäre eine Funktion namens Steueraddierer erstellen, an die Sie einen Steuersatz übergeben, und die eine Funktion zurückgibt, die den übergebenen Elementen einen festen Steuersatz hinzufügt:

addstatetax = maketaxadder (.05)

addlocaltax = maketaxadder (.015)

Hier haben wir zwei Funktionen zur Laufzeit erstellt, die z. addstatetax (100) gibt 105 zurück, während addlocaltax (100) 101,50 zurückgibt.

Die Variable addstatetax hat den „Wert“ einer Funktion, die eine Zahl annimmt und eine andere mit 5% addiert zurückgibt. Sie können ähnliche Aufgaben in C mit Strukturen und Funktionszeigern ausführen, aber es ist viel schwieriger (die Definition von Funktionszeigertypen in C ist notorisch schwierig) und fehleranfälliger.


Antwort 4:

Ein Funktionsname ist im Wesentlichen ein Zeiger. Sie können also Folgendes tun: void (* func) (int); func = myVoidFunc; // oder alternativfunc = & myVoidFunc;

und das ist wirklich der Hauptunterschied. Wenn Sie normalerweise mit Zeigern arbeiten, spielt es eine große Rolle, ob Sie den Operator address-of (kaufmännisches Und) verwenden oder nicht, wie zum Beispiel:

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

wird mit ziemlicher Sicherheit zu einem ganz anderen Verhalten führen, aber ansonsten sind Funktionsnamen nur Zeiger, zumindest sehe ich das so. Ich gehe ganz sicher auf Details ein. Ich habe überhaupt keinen Sinn, aber aus Ihrer und meiner Perspektive bin ich mir sicher, dass dies der Fall sein wird.

Ein weiterer Unterschied besteht natürlich darin, dass Sie einen Funktionsnamen nicht definieren können, dass Sie keine Zeigerarithmetik ausführen können oder zumindest, wenn dies äußerst gefährlich ist, und so weiter.