Dodjela (računarstvo)

U računarstvu, naredba dodjele ili pridruživanja je binarni računalni operator koji postavlja ili ponovno postavlja vrijednost pohranjenu u lokaciji/ama za pohranu označenim imenom varijable. U većini imperativnih računalnih programskih jezika, naredba dodjele je jedna od osnovnih naredbi.

Naredba dodjele često dopušta da isto ime varijable sadrži različite vrijednosti u različitim vremenima tijekom izvođenja programa.

Oznaka uredi

Uobičajeno tekstualno predstavljanje dodjele uključuje znak jednakosti (“=”) ili “:=”. Ova dva oblika su tipična za programske jezike, kao što je C, koji dodjelu klasificiraju kao infiksni operator.

varijabla = izraz Fortran, C, Java, …
varijabla := izraz ALGOL, Pascal, Ada, Dylan, …

Druge mogućnosti uključuju strelicu ulijevo ili istaknutu ključnu riječ.

varijabla <- izraz Objective Caml, S, R, ...
varijablaizraz APL
MOVE izraz TO varijabla COBOL
set varijabla to izraz AppleScript

Neki izrazno orijentirani jezici, kao što su Lisp i Tcl, jednoobrazno rabe funkcijsku sintaksu za sve naredbe, uključujući dodjelu.

(setq varijabla izraz) Lisp, Scheme (set!), …
set varijabla izraz Tcl

Djelovanje uredi

Semantički, operacija dodjele mijenja trenutno stanje izvršavajućeg programa. Sljedbeno tome, dodjela je ovisna o konceptu varijable. U dodjeli

  • Izraz izraz je evaluiran u trenutnom stanju programa.
  • Varijabli varijabla se dodjeljuje izračunata vrijednost, zamjenjujući prethodnu vrijednost varijable.

Primjer: Pretpostavljajući da je a numerička varijabla, dodjela a := 2*a znači da je sadržaj varijable a udvostručen nakon izvršavanja naredbe.

Primjer odsječka C koda:

      int x = 10; 
      float y;
      x = 23;
      y = 32.4;

U ovom primjeru, varijabla x je prvo deklarirana kao int (integer - cijeli broj), a potom joj je dodijeljena vrijednost 10. Valja uočiti da se deklaracija i dodjela odvijaju u istoj naredbi. U drugoj liniji koda y je deklariran bez dodjele. U trećoj liniji koda x je ponovno dodijeljena vrijednost 23. Konačno, y je dodijeljena vrijednost 32.4.

Za operaciju dodjele važno je da je vrijednost od izraz dobro definirana (da je valjana rvrijednost) te da varijabla predstavlja izmjenljiv entitet (valjana je izmjenljiva (ne-const) lvrijednost). U nekim jezicima kao što je Perl, nije nužno deklarirati varijablu prije dodjele.

Paralelna dodjela uredi

Neki programski jezici, kao što su Python, Perl, Ruby, OCaml i JavaScript (od inačice 1.7.), dopuštaju paralelnu dodjelu nekoliko varijabli. U pseudokodu:

 a,b := 0,1

Simultano dodjeljuje 0 varijabli a i 1 varijabli b. Zanimljivije,

 a,b := b,a

zamjenjuje vrijednosti varijabli a i b. U jezicima bez paralelne dodjele, ovo bi trebalo biti napisano rabeći privremenu varijablu:

 '''var''' t := a
 a := b
 b := t

s obzirom na to da a:=b ; b:=a ostavlja i u a i b izvornu vrijednost varijable b.

Vrijednost dodjele uredi

U većini izrazno orijentiranih programskih jezika, naredba dodjele vraća dodijeljenu vrijednost, dopuštajući idiome poput x = y = a, što dodjeljuje vrijednost varijable a i varijabli x i varijabli y, te poput while (f = read()) {}, koji rabi povratnu vrijednost funkcije za upravljanje petljom dok dodjeljuje istu vrijednost varijabli.

U drugim je programskim jezicima vrijednost dodjele nedefinirana i takvi su idiomi nevaljani. Primjeri takvih jezika su Scheme i Haskell.

Dodjela nasuprot jednostrukoj dodjeli uredi

U funkcijskom programiranju dodjela se obeshrabruje u korist jednostruke dodjele, također zvane i vezanje imena. Jednostruka se dodjela razlikuje od dodjele opisane u ovom članku na način da se može načiniti samo jednom - naknadne ponovne dodjele nisu dopuštene. Jednostruka dodjela je jedini način dodjele dostupan u čistim funkcijskim jezicima, kao što je Haskell, koji nemaju varijable. Nečisti funkcijski jezici pružaju pored jednostruke dodjele i onu pravu (iako se prava dodjela rabi s mnogo manjom učestalošću nego u imperativnim programskim jezicima). Primjerice, OCaml pruža jednostruku dodjelu sintaksom let ime = vrijednost, dok se prava dodjela pruža rabeći operator <-.

Dodjela nasuprot jednakosti uredi

Programeri početnici često brkaju dodjelu s usporedbom za jednakost, s obzirom na to da "=" označuje jednakost u matematici, i rabi se za dodjelu u mnogim jezicima. Ali dodjela mijenja vrijednost varijable, dok ispitivanje jednakosti ispituje imaju li dva izraza istu vrijednost.

U mnogim je jezicima operator dodjele jedan znak jednakosti ("=") dok je operator ekvivalencije nekoliko znakova jednakosti (obično se "==" koristi za usporedbu vrijednosti, a "===" za usporedbu i tipa i vrijednosti podatka) - u nekim jezicima, kao što je BASIC, jedan znak jednakosti se rabi u obje svrhe, s tim da kontekst odlučuje značenje uporabe.

Ovo može voditi ka greškama ako programer zaboravi koji je od oblika (=, ==, :=) prikladan (ili pogrešno otipka = kad je == potreban). Ovo je uobičajen programski problem s jezicima kao što je C, gdje operator dodjele također vraća dodijeljenu vrijednost, i može biti valjano ugniježđen unutar izraza (na isti način na koji funkcija vraća vrijednost). Ako je namjera usporedba dvaju vrijednosti if naredbom, primjerice, dodjela će najizglednije vratiti vrijednost koja se može interpretirati kao TRUE, u kojem će se pak slučaju izvršiti then podnaredba, što će pak voditi ka neočekivanom ponašanju. Neki jezični procesori mogu detektirati takve situacije i upozoriti programera na potencijalnu grješku.