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.
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 ; }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ř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 PODPROGRAMVytiskne se:
A=7, B=9, C=0 A=7, B=9, C=63