Wat ass den Ënnerscheed tëscht engem Funktiounsnumm an enger Variabel am C-Programméierung?


beäntweren 1:

E Funktiounsnumm ass en Numm deen Dir zu enger Funktioun zougewisen hutt déi Dir erstallt hutt, déi 1 a ville Codelinne besetzen. Eng Funktioun kann 0 op vill, vill Parameteren kréien. awer nëmmen een zréckbréngt.

Eng Variabel ass am Wesentlechen e Memory Memory genannt deen zougewisen ass fir Informatioun ze kréien an ze späicheren an déi och un eng Funktioun als Parameter weiderginn kann. Typesch sinn Variabelen op e bestëmmten Typ gesat: ganzt, Sait, Zeechen, etc.


beäntweren 2:
Wat ass den Ënnerscheed tëscht engem Funktiounsnumm an enger Variabel am C-Programméierung?

Dëst sinn zwee komplett verschidde Saachen.

E Funktiounsnumm (ënnersträichen ass net erfuerderlech, et ass just e Saz) ass den Numm vun enger Funktioun déi spezifizéiert gëtt wann d'Funktioun deklaréiert oder definéiert ass.

Eng Variabel ass - gutt, et ass net 100% kloer wat eng "Variabel" am C ass. De C Standard benotzt d'Wuert "Variabel" net am gewéinleche Sënn. C definéiert de Begrëff Objet als "Gebitt vun der Datelagerung an der Ausféierungsëmfeld, den Inhalt vun deem kann Wäerter representéieren". E genannte deklaréierten Objet ka mat Liichtegkeet eng "Variabel" genannt ginn, awer et gëtt kee Konsens iwwer wat genau eng "Variabel" ass oder net.

Eng Funktioun kann genannt ginn. En Objet kann Wäerter enthalen.


beäntweren 3:

Den Haaptunterschied ass datt d'Funktioun mat engem Funktiounsnumm assoziéiert automatesch vum Compiler. Am C sinn d'Funktiounen net "éischtklasseg Objete" - Dir kënnt se net un Funktiounen weiderginn, déi se änneren / kombinéieren an se als Zuelen oder Strings zréckginn.

Variabelen enthalen d'Wäerter vu Primobjekter (Ganzzuelen, Charakteren, Schwéierpunktzuelen, asw.). Dir kënnt e Pointer zu enger Funktioun hunn, an dat ass e primäre Objet deen Dir gespäichert oder passéiere / zréckgoe vu Funktiounen (a Funktioune ruffe kann), awer Dir kënnt net de "Wäert" vun der Funktioun selwer beim Runtime änneren, wéi Dir maacht et mat éischtklassegen Objeten.

Also si kucken zimlech ähnlech wéi Variabelen, awer dat eenzegt wat Dir mat hinnen maache kënnt ausser hir Adress ze huelen ass se ze nennen. Dir kënnt net main = {eppes ...} soen, Dir musst just eng Haaptfunktioun definéieren an de Compiler maache maache hannert de Kulisse fir den Numm an de Code.

Sprooche wéi Haskell, an där Dir de Wäert vun de Funktioune beim Runtime definéiere kënnt, ginn dofir "funktionell" Sprooche genannt. Een einfacht Beispill wier et eng Funktioun ze ginn, genannt Steieradder, zu där Dir e Steiersaz passéiert an déi eng Funktioun zréckbréngt, déi e feste Steiersaz fir déi passéiert Elementer bäidréit:

addstatetax = maketaxadder (.05)

addlocaltax = maketaxadder (.015)

Hei hu mir zwou Funktiounen am Runtime erstallt. addstatetax (100) gëtt 105 zréck, während Addlocaltax (100) 101,50 zréckkënnt.

D'Variabel addstatetax huet de "Wäert" vun enger Funktioun déi eng Nummer hëlt an eng aner derbäigesat mat 5% zréckkënnt. Dir kënnt ähnlech Aufgaben am C mat Strukturen a Funktiounsweiser ausféieren, awer et ass vill méi schwéier (Definitioun vu Funktiounspoypertypen an C ass notoresch schwéier) an ufälleg fir Feeler.


beäntweren 4:

E Funktiounsnumm ass am Wesentlechen e Poder. Also kënnt Dir déi folgend maachen: ongëlteg (* func) (int); func = myVoidFunc; // oder alternativ func = & myVoidFunc;

an dat ass wierklech den Haaptunterschied. Wann Dir normalerweis mat Pointer schafft, mécht et e groussen Ënnerscheed ob Dir de Adress-vum Bedreiwer benotzt oder net, sou wéi:

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

wäert bal sécher zu engem ganz aneren Verhalen féieren, awer soss Funktiouns Nimm si just Zeechen, op d'mannst dat ass wéi ech et gesinn. Ech wäert do an Detailer goen. Ech hu guer kee Sënn, awer aus Ärer a menger Perspektiv sinn ech sécher datt dëst de Fall wäert sinn.

En aneren Ënnerscheed, natierlech, ass datt Dir e Funktiounsnumm net kënnt definéieren, datt Dir keng Pointer Arithmetik maache kënnt, oder op d'mannst wann et extrem geféierlech ass, an sou weider.