A számítógépes programozásban a hozzárendelési utasítás, az értékadás beállítja és/vagy visszaállítja a változó neve által megjelölt tárolóhely(ek)en tárolt értéket; más szóval egy értéket másol a változóba. A legtöbb imperatív programozási nyelvben az értékadó utasítás (vagy kifejezés) egy alapvető konstrukció.
Napjainkban ennek a műveletnek a leggyakrabban használt jelölése az x = expr (eredetileg Superplan 1949-51, amelyet a Fortran 1957 és a C tett népszerűvé). A második leggyakrabban használt jelölés az x := expr (eredetileg ALGOL 1958, amelyet a Pascal tett népszerűvé) Sok más jelölés is használatos. Egyes nyelvekben a használt szimbólumot operátornak tekintik (ami azt jelenti, hogy az értékadó utasítás egésze egy értéket ad vissza). Más nyelvek az értékadást utasításként definiálják (ami azt jelenti, hogy nem használható kifejezésben).
A hozzárendelések általában lehetővé teszik, hogy egy változó különböző értékeket tartson fenn élettartama és hatóköre során különböző időpontokban. Egyes nyelvek (elsősorban a szigorúan funkcionális nyelvek) azonban nem engedik meg ezt a fajta „destruktív” átértékelést, az a nem lokális állapot megváltozását vonhatja maga után. A cél a referenciális átláthatóságAz analitikus filozófiában és az informatikában a referenciális transzparencia és a referenciális átlátszatlanság a nyelvi konstrukciók, és ezen keresztül a nyelvek tulajdonságai. érvényesítése, azaz olyan függvények létrehozása, amelyek nem függenek bizonyos változók állapotától, de ugyanazt az eredményt hozzák egy adott paraméteres bemeneti halmazra bármely időpontban. A modern programok más nyelveken is gyakran alkalmaznak hasonló stratégiákat, bár kevésbé szigorúan, és csak bizonyos részekben, a bonyolultság csökkentése érdekében, általában olyan kiegészítő módszerekkel, mint az adatstruktúrálás, a strukturált programozás és objektumorientáltsággal együtt.
Szemantika Az értékadó művelet egy olyan folyamat az imperatív programozásban, amelyben egy adott változónévhez az idő múlásával különböző értékek társulnak. A program ilyen modellben úgy működik, hogy egymást követő értékadó utasításokkal változtatja az állapotát. Az imperatív programozási nyelvek primitívjei értékadásra támaszkodnak az iteráció végrehajtásához. A legalacsonyabb szinten az értékadást gépi műveletekkel valósítják meg, mint például a MOVE vagy a STORE.Crossing borders: Explore functional programming with Haskell , by Bruce Tate
A változók értékek tárolói. Lehetséges egy értéket beírni egy változóba, majd később egy újra cserélni. Az értékadó művelet módosítja a futó program aktuális állapotát. Következésképpen az értékadás a változók fogalmától függ. Egy értékadás során:
A kifejezés a program aktuális állapotában kerül kiértékelésre. A változó-hoz a kiszámított érték lesz rendelve, amely felülírja a változó korábbi értékét.
Példa: Feltételezve, hogy az a egy numerikus változó, az a := 2*a értékadás azt jelenti, hogy az a változó tartalma megduplázódik az utasítás végrehajtása után.
Egy példa a C kód egy szegmensére:
int x = 10; float y; x = 23; y = 32.4f;
Ebben a példában az x változót először int-ként deklaráljuk, majd a 10 értéket rendeljük hozzá. Figyeljük meg, hogy a deklaráció és az értékadás ugyanabban az utasításban történik. A második sorban az y értékadás nélkül van deklarálva. A harmadik sorban az x értéke 23 lesz. Végül az y értéke 32,4.
Egy értékadó művelethez szükséges, hogy a kifejezés értéke jól definiált legyen (érvényes rvalueNéhány nyelv a balérték (l-value) és jobbérték (r-value) fogalmát használja, amely az értékadó utasítások bal és jobb oldalán található tipikus kiértékelési módból származik. A balérték egy olyan objektumra utal, amely egyetlen kifejezésen túl is létezik. Az r-érték egy ideiglenes érték, amely nem marad fenn azon a kifejezésen túl, amelyik használja.), és hogy a változó egy módosítható entitást képviseljen (érvényes módosítható – nem konstans – balérték). Néhány nyelvben, jellemzően a dinamikusakban,A dinamikus programozási nyelv lehetővé teszi különféle műveletek futásidejű meghatározását és végrehajtását. nem szükséges deklarálni egy változót az értékadás előtt. Ezekben a nyelvekben egy változó automatikusan deklarálódik az első értékadáskor, a deklarált hatókör nyelvenként változik.
Egyszeri értékadás Bármely értékadás, amely egy meglévő értéket módosít (pl. x := x + 1), nem engedélyezett a tisztán funkcionálisA számítástudományban a tisztán funkcionális programozás általában egy olyan programozási paradigmát jelöl – a számítógépes programok szerkezetének és elemeinek felépítési stílusát –, amely minden számítást matematikai függvények kiértékeléseként kezel. nyelvekben. A funkcionális programozásban az értékadást ellenjavallják, és ehelyett az egyszeri értékadást (single assignment) részesítik előnyben, amelyet általában inicializálásnak neveznek. Az egyszeri értékadás a névhezkötés (name binding) egyik példája, és abban különbözik a cikkben leírt értékadástól, hogy csak egyszer végezhető el, általában a változó létrehozásakor; későbbi átértékelés nem megengedett.
Egy kifejezés kiértékelésének nincs mellékhatása, ha az eredmény előállításán kívül nem változtatja meg a gép megfigyelhető állapotát, és ugyanarra a bemenetre mindig ugyanazt az értéket adja. Az imperatív értékadás mellékhatásokat okozhat, a régi értéket megsemmisíti és elérhetetlenné teszi, miközben egy új értékkel helyettesíti, ezért a LISP-ben és a funkcionális programozásban destruktív értékadásnak nevezik, hasonlóan a destruktív frissítéshez.A számítástechnikában a perzisztens adatszerkezet (persistent data structure vagy not ephemeral data structure) olyan adatszerkezet, amely módosításakor mindig megőrzi önmagának előző verzióját. Az ilyen adatszerkezetek gyakorlatilag megváltoztathatatlanok, mivel műveleteik nem (láthatóan) frissítik a struktúrát helyben, hanem mindig egy új, frissített struktúrát eredményeznek.
Az egyszeri értékadás az egyetlen elérhető hozzárendelési forma a tisztán funkcionális nyelvekben, mint például a Haskell, amelyek nem tartalmaznak változókat az imperatív programozási nyelvek értelmében vett változókkal, hanem névvel ellátott, esetleg összetett jellegű konstans értékekkel, amelyek elemeit fokozatosan, igény szerint határozzák meg a lustaA programozási nyelvelméletben a lusta kiértékelés (lazy evaluation), vagy igény szerinti hívás (call-by-need) egy olyan kiértékelési stratégia, amely egy kifejezés kiértékelését késlelteti, amíg az értékére szükség nem lesz (nem szigorú kiértékelés), és amely elkerüli az ismételt kiértékeléseket (megosztás használatával). nyelvek számára. A tisztán funkcionális nyelvek lehetőséget biztosítanak a számítások párhuzamos végrehajtására, elkerülve a Neumann-féle szűk keresztmetszetet,Ugyanazon busz használata utasítások és adatok lekérésére a Neumann-féle szűk keresztmetszethez vezet, ami a központi feldolgozó egység (CPU) és a memória közötti korlátozott átviteli sebességet (adatátviteli sebességet) jelent a memória mennyiségéhez képest. amely a szekvenciális, lépésenkénti végrehajtást jelenti, mivel az értékek függetlenek egymástól.
A nem tiszta funkcionális nyelvek mind egyszeri, mind valódi értékadást biztosítanak (bár a valódi értékadást jellemzően ritkábban használják, mint az imperatív programozási nyelvekben). Például a Scheme-ben mind az egyszeri értékadás (let-tel), mind a valódi értékadás (set!-tel) használható minden változón, és speciális primitívek állnak rendelkezésre a listákon, vektorokon, karakterláncokon stb. belüli destruktív frissítéshez. Az OCaml-benAz OCaml egy általános célú, magas szintű, több paradigmát támogató programozási nyelv, amely a Caml (Categorical Abstract Machine Language) dialektusát az ML (Meta Language) objektumorientált funkcióival bővíti. a változók esetében csak egyszeri értékadás engedélyezett a let name = value szintaxis segítségével; azonban a destruktív frissítés használható tömbök és sztringek elemein külön <- operátorral, valamint rekordok és objektumok mezőin, amelyeket a programozó explicit módon módosíthatónak (azaz a kezdeti deklarációjuk után módosíthatónak) deklarált.Az objektumorientált (OO) és funkcionális programozásban az állandó objektum (immutable object) olyan objektum, amelynek állapota a létrehozása után nem módosítható. Ez ellentétben áll a módosítható objektummal (mutable object vagy changeable object), amely a létrehozása után módosítható.
Az egyszeri értékadást használó funkcionális programozási nyelvek közé tartozik a Clojure (adatszerkezetekhez, nem változókhoz),A Clojure a Lisp programozási nyelv dinamikus és funkcionális dialektusa Java platformon. az Erlang (többszörös értékadást is elfogad, ha az értékek egyenlőek, ellentétben a Haskell-lel), az F#, a Haskell, a JavaScript (konstansokhoz), a Lava, az OCaml, az Oz (adatfolyam-változókhoz, nem cellákhoz), a Racket (bizonyos adatszerkezetekhez, például listákhoz, nem szimbólumokhoz), a SASL, a Scala (értékekhez), a SISAL és a Standard ML. A nem visszalépéses Prolog kódot explicit egyszeri értékadásúnak tekinthetjük, abban az értelemben, hogy a (megnevezett) változói explicit módon nem hozzárendelt állapotban lehetnek, vagy pontosan egyszer állíthatók be. A Haskellben ezzel szemben nem lehetnek nem hozzárendelt változók, és minden változót úgy tekinthetünk, mintha implicit módon, létrehozásakor beállították volna az értékét (vagy inkább egy számítási objektumot, amely igény szerint előállítja az értékét).
Értékadás értéke Néhány programozási nyelvben az értékadó utasítás értéket ad vissza, míg másokban nem.
A legtöbb kifejezés-orientált programozási nyelvben (például C-ben) az értékadó utasítás visszaadja a hozzárendelt értéket, lehetővé téve az olyan idiómákat, mint az x = y = a, amelyben az y = a értékadó utasítás visszaadja az a értékét, amelyet aztán az x-hez rendelünk hozzá. Egy olyan utasításban, mint a while ((ch = getchar()) != EOF) {…}, egy függvény visszatérési értékét használjuk egy ciklus vezérlésére, miközben ugyanazt az értéket rendeljük egy változóhoz.
Más programozási nyelvekben, például a Scheme-ben, az értékadás visszatérési értéke nincs definiálva, és az ilyen idiómák érvénytelenek.
A Haskellben nincs változóértékadás; de az értékadáshoz hasonló műveletek (például egy tömb eleméhez vagy egy módosítható adatszerkezet mezőjéhez való értékadás) általában az egységtípustA matematikai logika és a számítástechnika típuselméletként ismert területén az egységtípus olyan típus, amely csak egy értéket enged meg. adják vissza, amelyet () alakban jelölünk. Ennek a típusnak csak egy lehetséges értéke van, ezért nem tartalmaz információt. Ez jellemzően az a kifejezéstípus, amelyet kizárólag a mellékhatásai szempontjából értékelnek ki.
Különféle értékadási formák Bizonyos használati minták nagyon gyakoriak, ezért gyakran speciális szintaxissal rendelkeznek a támogatásukhoz. Ezek elsősorban szintaktikai cukorkéntA számítástechnikában a szintaktikai cukor (syntactic sugar) egy programozási nyelven belüli szintaxis, amelynek célja, hogy megkönnyítse a dolgok olvasását vagy kifejezését. A nyelv „édesebbé” válik az emberi használat számára: a dolgokat világosabban, tömörebben vagy olyan alternatív stílusban lehet kifejezni, amelyet egyesek jobban kedvelnek. szolgálnak a forráskód redundanciájának csökkentésére, de segítenek a kód olvasóinak megérteni a programozó szándékát, és támpontot adnak a fordítónak a lehetséges optimalizáláshoz.
Kiterjesztett értékadás