Parametr (programování)

Aktuální verze stránky ještě nebyla zkontrolována zkušenými přispěvateli a může se výrazně lišit od verze recenzované 26. května 2021; kontroly vyžadují 3 úpravy .

Parametr v programování  je argument přijatý funkcí. Termín "argument" znamená, co přesně bylo předáno a ke které konkrétní funkci a parametr - v jaké kapacitě to funkce použila. To znamená, že volající kód předá argument parametru, který je definován v členu specifikace funkce.

Formální a skutečné parametry

Je důležité rozlišovat:

Příklad v jazyce C :

// Popis funkce. int a - formální parametr, název parametru může chybět. int mojefunkce ( int a ); // Definice funkce. int b - formální parametr, název parametru se nemusí shodovat s názvem uvedeným při deklaraci funkce. int mojefunkce ( int b ) { návrat 0 ; } int main () { int c = 0 ; myfunkce ( c ); // Volání funkce. c je skutečný parametr. návrat 0 ; }

Použití parametrů

Sémantika používání formálních a skutečných parametrů se nazývá strategie hodnocení . Daná strategie vyhodnocování určuje , kdy mají být vyhodnoceny argumenty funkce (metoda, operace, vztah) a jaké hodnoty by se měly předávat. Existuje několik různých strategií výpočtu.

Poznámka - použití termínu " předávání parametrů " , běžného v  komunitě imperativních programátorů , není pro mnoho programovacích jazyků zcela správné - například v případě volání nutnosti , používaného v jazyce Haskell , parametr může být použit v těle funkce, ale nikdy neprošel pro všechny případy jejího volání a dokonce zcela vyloučen z výsledného strojového kódu.

Nejčastěji zmiňovanými evaluačními strategiemi jsou call by value a call by reference , ale skutečné použití těchto termínů není vždy vhodné. Například v komunitě jazyka Java říkají „ Java používá volání podle hodnoty, kde „hodnota“ je odkaz na objekt “ a v komunitě jazyka Ruby říkají „ Ruby používá volání podle reference “, ale ve skutečnosti oba tyto jazyky použijte strategii call by reference .call  -by-sharing ) [3] [4] . Mnoho jazyků, jako je C , nemá mechanismus call-by-reference, ale umožňuje jeho simulaci v rámci sémantiky call-by-value pomocí typů odkazů , zejména ukazatelů . V druhém případě se v komunitách takových jazyků často říká „ jazyk podporuje dvě strategie hodnocení “, stejně jako „ volání podle ukazatele “ nebo „ volání podle adresy “.

V praxi je výpočetní model mnoha průmyslových jazyků ( Java , C# ) redukován na strategii „ call-at-mention/pass-by-reference “. Některé starší jazyky, zejména nebezpečné jazyky, jako je C++ , kombinují několik různých vzorů volání, včetně exotických, jako je volání podle odkazu na konstantu . Historicky se volání podle hodnoty a volání podle jména vrací k Algolu-60 , vytvořenému koncem 50. let 20. století . Pouze čisté funkcionální jazyky, jako je Clean a Haskell , používají call - by  -need , což se často ztotožňuje (což také není úplně správné) s líným hodnocením .

Příklady

Předání parametru odkazem znamená, že se nekopíruje samotná hodnota , ale adresa původní proměnné (jako v případě předávání parametru adresou), nicméně je použita syntaxe, takže programátor nemusí používat operace dereference a může pracovat přímo s hodnotou uloženou na této adrese (jako v případě předávání parametru hodnotou).

Předání odkazem zabrání kopírování všech informací popisujících stav objektu (který může být výrazně větší než sizeof(int)) a je nezbytné pro konstruktor kopírování .

Pokud funkce vrací hodnotu odkazem (například ve tvaru "return *this;"), lze její volání použít nalevo od operátoru přiřazení (viz také L-výraz ).

Pokud se předávání odkazem používá přesně jako prostředek ke zvýšení výkonu, ale změna parametru je nežádoucí, můžete použít předávání odkazem na konstantní objekt.

Příklad v C++ : #include <iostream> pomocí jmenného prostoru std ; // pro použití cout void f ( int x ) { // předání parametru hodnotou cout << x ; x = 1 _ cout << x ; } void g ( int * x ) { // předání parametru na adresu cout << * x ; * x = 2 ; cout << * x ; } void h ( int & x ) { // předání parametru odkazem cout << x ; x = 3 ; cout << x ; } void i ( const int & x ) { // předání neměnného parametru odkazem cout << x ; x = 4 ; // Chyba, kvůli které se kód nezkompiluje 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 ; návrat 0 ; }

Dalo by se tedy očekávat, že ukázkový program vypíše (pokud je chybný řádek zakomentován) „0010 022 233 333“.

Některé jazyky (nebo jejich dialekty) nepodporují pass-by-reference, zatímco jiné naopak předávají parametry výhradně odkazem, což vytváří riziko neúmyslné změny kontextu volající funkce.

Jazyk Fortran znamená předávání parametrů výhradně odkazem:

Fortran příklad :

Program:

PARAMETRY PROGRAMU IMPLICITNÍ ŽÁDNÉ CELÉ ČÍSLO A , B , C A = 7,0 B = 9,0 C = 0,0 100 FORMÁT ( 'A =' , I2 , ', B =' , I2 , ', C =' , I3 ) WRITE ( * , 100 ) A , B , C VOLEJTE MUL ( A , B , C ) PIŠTE ( * , 100 ) A , B , C UKONČIT PROGRAM PODPROGRAM MUL ( A , B , C ) CELÉ ČÍSLO A , B , C C = A * B KONEC PODPROGRAM

Vytiskne se:

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

Viz také

Literatura

Odkazy

  1. Programování GNU C – aktuální parametry a formální parametry  . Získáno 13. října 2012. Archivováno z originálu 16. února 2020.
  2. Definování a volání funkcí . Získáno 13. října 2012. Archivováno z originálu dne 28. srpna 2012.
  3. Fredrik Lundh. Call By Object  (anglicky)  (downlink) . effbot.org . Získáno 29. května 2014. Archivováno z originálu dne 23. listopadu 2019.
  4. Definice jazyka Iota . CS 412/413 Úvod do kompilátorů . Cornell University (2001). Získáno 29. 5. 2014. Archivováno z originálu 23. 9. 2015.