Parameter (programmering)

Den aktuelle version af siden er endnu ikke blevet gennemgået af erfarne bidragydere og kan afvige væsentligt fra den version , der blev gennemgået den 26. maj 2021; checks kræver 3 redigeringer .

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.

Formelle og faktiske parametre

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 ; }

Brug af parametre

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 .

Eksempler

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 SUBRUTINE

Vil udskrive:

A=7, B=9, C=0 A=7, B=9, C=63

Se også

Litteratur

Links

  1. ↑ GNU C - programmeringen - Faktiske parametre og formelle parametre  . Hentet 13. oktober 2012. Arkiveret fra originalen 16. februar 2020.
  2. Definere og kalde funktioner . Hentet 13. oktober 2012. Arkiveret fra originalen 28. august 2012.
  3. Fredrik Lundh. Call By Object  (engelsk)  (downlink) . effbot.org . Hentet 29. maj 2014. Arkiveret fra originalen 23. november 2019.
  4. Iota sprogdefinition . CS 412/413 Introduktion til compilere . Cornell University (2001). Hentet 29. maj 2014. Arkiveret fra originalen 23. september 2015.