En parameter i programmering er et argument, der accepteres af en funktion. Udtrykket "argument" indebærer, hvad der præcist blev videregivet og til hvilken bestemt funktion , og parameteren - i hvilken kapacitet funktionen anvendte denne modtog. Det vil sige, at den kaldende kode sender argumentet til en parameter, der er defineret i et medlem af funktionsspecifikationen.
Det er vigtigt at skelne:
Eksempel på C -sprog :
// Funktionsbeskrivelse. int a - formel parameter, kan parameternavn være fraværende. int minfunktion ( int a ); // Funktionsdefinition. int b - formel parameter, kan parameternavnet muligvis ikke matche det, der er angivet, når funktionen erklæres. int myfunction ( int b ) { returnere 0 ; } int main () { int c = 0 ; minfunktion ( c ); // Funktionskald. c er den faktiske parameter. returnere 0 ; }Semantikken ved at bruge formelle og faktiske parametre kaldes evalueringsstrategi . En given evalueringsstrategi dikterer, hvornår argumenterne for en funktion (metode, operation, relation) skal evalueres, og hvilke værdier der skal passeres. Der er en del forskellige beregningsstrategier.
Bemærk - brugen af udtrykket " parameter passing ", der er almindeligt i det imperative programmeringsfællesskab ,er ikke helt korrekt for mange programmeringssprog - for eksempel, i tilfælde af et nødopkald , brugt i Haskell-sproget , parameteren kan bruges i funktionslegemet, men aldrig bestået for alle tilfælde af dets opkald, og endda helt udelukket fra den resulterende maskinkode.
De mest almindeligt nævnte evalueringsstrategier er call by value og call by reference , men den faktiske brug af disse termer er ikke altid passende. For eksempel siger de i Java -sprogfællesskabet " Java bruger kald efter værdi, hvor 'værdi' er en objektreference " og i Ruby -sprogfællesskabet siger de " Ruby bruger kald ved reference ", men i virkeligheden er begge disse sprog brug call by reference- strategien .call -by-sharing ) [3] [4] . Mange sprog, såsom C , har ikke en call-by-reference-mekanisme, men tillader en simulering inden for call-by-value-semantik gennem referencetyper , især pointers . I sidstnævnte tilfælde, i fællesskaber af sådanne sprog, siges det ofte " sproget understøtter to evalueringsstrategier ", såvel som " opkald efter pointer " eller " opkald efter adresse ".
I praksis er beregningsmodellen for mange industrisprog ( Java , C# ) reduceret til en " opkald-at-omtale/pass-by-reference "-strategi. Nogle ældre sprog, især usikre sprog, såsom C++ , kombinerer flere forskellige opkaldsmønstre, herunder eksotiske, såsom call-by-reference-to- constant . Historisk set går call by value og call by name tilbage til Algol-60 , skabt i slutningen af 1950'erne . Kun rene funktionelle sprog, såsom Clean og Haskell , bruger call - by -need , som ofte identificeres (hvilket heller ikke er helt korrekt) med doven evaluering .
At videregive en parameter ved reference betyder, at ikke selve værdien kopieres , men adressen på den oprindelige variabel (som i tilfældet med at sende en parameter efter adresse), men syntaksen bruges således, at programmøren ikke skal bruge dereferenceoperation og kan handle direkte med den værdi, der er gemt på denne adresse (som i tilfælde af parameter, der passerer ved værdi).
Ved at videregive ved reference undgår man at kopiere al information, der beskriver objektets tilstand (som kan være væsentligt større end sizeof(int)) og er nødvendig for kopikonstruktøren .
Hvis en funktion returnerer en værdi ved reference (for eksempel i formen "return *dette;"), så kan dens kald bruges til venstre for tildelingsoperatøren (se også L-udtryk ).
Hvis passing by reference bruges præcist som et middel til at øge ydeevnen, men det er uønsket at ændre parameteren, kan du bruge passing by reference af et konstant objekt.
Eksempel i C++ : #include <iostream> bruger navneområde std ; // for at bruge cout void f ( int x ) { // sende en parameter ved værdi cout << x ; x = 1 _ cout << x ; } void g ( int * x ) { // sender en parameter til adresse cout << * x ; * x = 2 ; cout << * x ; } void h ( int & x ) { // sende en parameter ved referencecout << x ; x = 3 ; cout << x ; } void i ( konst int & x ) { // sender en uforanderlig parameter ved referencecout << x ; x = 4 ; // Fejl på grund af hvilken koden ikke vil blive kompileret cout << x ; } int main () { int x = 0 ; cout << x ; f ( x ); cout << x << " " ; g ( & x ); cout << x << " " ; h ( x ); cout << x << " " ; i ( x ); cout << x ; returnere 0 ; }Således ville man forvente, at eksempelprogrammet udskriver (hvis den fejlagtige linje er kommenteret ud) "0010 022 233 333".
Nogle sprog (eller deres dialekter) understøtter ikke pass-by-reference, mens andre tværtimod overfører parametre udelukkende ved reference, hvilket skaber risikoen for utilsigtet at ændre konteksten for den kaldende funktion.
Fortran - sproget indebærer at overføre parametre udelukkende ved reference:
Fortran eksempel :Program:
PROGRAMPARAMETER IMPLICERER INGEN HELTAL A , B , C A = 7,0 B = 9,0 C = 0,0 100 FORMAT ( 'A =' , I2 , ', B =' , I2 , ', C =' , I3 ) SKRIV ( * , 100 ) A , B , C RING MUL ( A , B , C ) SKRIV ( * , 100 ) A , B , C AFSLUT PROGRAM SUBRUTINE MUL ( A , B , C ) HELTAL A , B , C C = A * B END SUBRUTINEVil udskrive:
A=7, B=9, C=0 A=7, B=9, C=63