Hodnota v programování je datový prvek , který je jedním z možných členů datového typu [1] , který může odpovídat nějakému stavu proměnné nebo konstanty odpovídajícího typu. Například 2 je hodnota typu integer .
V jazycích se schopností přiřazovat hodnoty proměnným je nutné rozlišovat mezi r-hodnotami (r-hodnota - obsah) a l-hodnotami (l-hodnota - umístění) proměnné [ 2] .
V deklarativních jazycích musí být hodnoty referenční transparentní . To znamená, že výstupní hodnota je nezávislá na umístění výrazu (nebo podvýrazu) potřebného k vyhodnocení hodnoty.
Myšlenka hodnot bl a r-hodnot pochází z programovacích jazyků s operátory přiřazení, ve kterých hodnoty nalevo (vlevo) a vpravo (vpravo) od operátora používají jiný režim hodnocení. Hodnota l ukazuje na objekt, který přetrvává mimo jediný výraz. Hodnota r je dočasná hodnota, která nepřetrvává za výrazem, který ji používá. [3]
Pojmy l-value a r-value byly zavedeny v jazyce CPL . Koncepty ve vyjádřeních hodnot r, l-hodnot a r/l-hodnot odpovídají následujícím režimům parametrů : vstupní parametr (má hodnotu), výstupní parametr (lze přiřadit) a vstupní/výstupní parametr ( má hodnotu a lze ji přiřadit), mezi jazyky však existují technické rozdíly v závislosti na kontextu.
V mnoha jazycích, zejména v jazycích podobných C , mají l-hodnoty adresu úložiště , která je programově dostupná pro spouštěný program (například pomocí adresovacího operátoru "&" v C/C++). To znamená, že l-hodnoty jsou proměnné nebo dereferencované odkazy na konkrétní oblasti paměti. R-hodnoty mohou být l-hodnoty (viz níže) nebo jiné než l-hodnoty (termín zavedený pro odlišení od l-hodnot). Vezměte si například výraz 4 + 9v jazyce C. Za běhu program generuje hodnotu 13, ale protože program nespecifikuje, kde je těchto 13 obsaženo, výraz není l-hodnota. Na druhou stranu, pokud program v C deklaruje proměnnou x, které je přiřazena hodnota 13, pak výraz xmá hodnotu 13 a je to l-hodnota.
Nejprve termín l-hodnota označoval v jazyce C něco, čemu lze něco přiřadit (odtud název, který naznačuje, že je nalevo (vlevo) od operátoru přiřazení), ale protože vyhrazené slovo const(konstanta ) má byl přidán do jazyka ), termín nyní zní jako "upravitelná l-hodnota". V C++11 existuje speciální sémantický glyf &&pro "použít adresu výrazu pouze kompilátorem"; to znamená, že adresu nemůže operátor vypočítat &během provádění programu. (viz sémantika pohybu ).
Tento typ odkazu lze použít pro všechny r-hodnoty, včetně l-hodnot i ne-l-hodnot. Některé procesory mají instrukce, které mají okamžitou hodnotu . Okamžitá hodnota je uložena jako součást instrukce, která ji obvykle používá k umístění do registru nebo k jejímu přičtení či odečtení. Dalšími částmi instrukce jsou operační kód a přijímač (registr). To druhé může být nevyslovené. Neokamžitá hodnota může být v registru nebo v paměti a instrukce musí obsahovat přímou nebo nepřímou adresu hodnoty, jako je index registru, ze kterého je hodnota převzata.
L-hodnota jako výraz ukazuje na objekt[ specifikovat ] . Nemodifikovatelná (konstantní) l-hodnota má adresu, ale nelze ji změnit. Naproti tomu měnitelná l-hodnota vám umožňuje nejen načíst objekt, ale také mu přiřadit jinou hodnotu. Hodnota R je jakýkoli výraz (včetně hodnot l) a hodnota jiná než l je jakýkoli výraz, který není hodnotou l. Příkladem jiné hodnoty než l je okamžitá hodnota, která nemá žádnou adresu.
Hodnota může být libovolného z dostupných datových typů : může to být řetězec, číslice nebo jeden znak.
Mnoho procesorů podporuje více velikostí okamžitých hodnot, jako je 8 nebo 16 bitů, s použitím různých instrukčních kódů pro každou z nich. Pokud programátor vloží hodnotu, která se nehodí, pak assembler vydá chybu „Mimo rozsah “ . Většina assemblerů umožňuje okamžité hodnoty v ASCII , desítkovém , šestnáctkovém , osmičkovém nebo binárním formátu. To znamená, že znak ASCII je shodný s hodnotou nebo . Pořadí bajtů v textových řetězcích se může lišit v závislosti na typu procesoru, verzi assembleru nebo architektuře počítače. 'A'650x41