Rozšířené přiřazení - Augmented assignment

Rozšířené přiřazení (nebo složené přiřazení ) je název daný určitým operátorům přiřazení v určitých programovacích jazycích (zejména těch odvozených od C ). Rozšířené přiřazení se obvykle používá k nahrazení příkazu, kde operátor bere proměnnou jako jeden ze svých argumentů a poté přiřadí výsledek zpět ke stejné proměnné. Jednoduchý příklad je, který je rozšířen na . Podobné konstrukce jsou často k dispozici pro různé binární operátory. x += 1x = x + (1)

Obecně platí, že v jazycích nabízejících tuto funkci má většina operátorů, které mohou jako jeden ze svých argumentů přijmout proměnnou a vrátit výsledek stejného typu, ekvivalent rozšířeného přiřazení, který přiřadí výsledek zpět proměnné na místě, včetně aritmetických operátorů, bitshift operátory a bitové operátory .

Diskuse

V mnoha programech lze například najít následující prohlášení nebo jeho variace:

x = x + 1

To znamená „najděte číslo uložené v proměnné x , přidejte k ní 1 a výsledek sčítání uložte do proměnné x “. Jakkoli se to zdá jednoduché, může to mít neúčinnost v tom, že umístění proměnné x je třeba vyhledat dvakrát, pokud kompilátor nerozpozná, že dvě části výrazu jsou totožné: x může být odkaz na nějaký prvek pole nebo jiná složitost. Pro srovnání je zde rozšířená verze přiřazení:

x += 1

S touto verzí neexistuje žádná omluva pro kompilátor, který nevygeneruje kód, který vyhledá umístění proměnné x pouze jednou a upraví jej na místě, pokud strojový kód samozřejmě takovou sekvenci podporuje. Pokud je například x jednoduchá proměnná, může být sekvence strojového kódu něco jako

 Load  x
 Add   1
 Store x

a pro oba formuláře by byl generován stejný kód. Ale pokud existuje speciální operační kód, může být

 MDM   x,1

což znamená „Upravit paměť“ přidáním 1 do x a slušný kompilátor by vygeneroval stejný kód pro oba formuláře. Některé strojové kódy nabízejí operace INC a DEC (k přidání nebo odečtení jednoho), jiné mohou povolit i jiné konstanty.

Obecněji je forma

x ?= expression

kde ? znamená nějaký operátor (ne vždy + ) a nemusí existovat žádné speciální operační kódy, které by pomohly. Stále existuje možnost, že pokud x je komplikovaná entita, kompilátor bude povzbuzován, aby se vyhnul duplikaci v přístupu k x , a samozřejmě, pokud x je dlouhý název, bude vyžadováno méně psaní. Toto poslední bylo základem podobné funkce kompilátorů ALGOL nabízených prostřednictvím systémů Burroughs B6700 , přičemž symbol vlnovky znamená přiřazenou proměnnou, takže

LongName:=x + sqrt(LongName)*7;

stal by se

LongName:=x + sqrt(~)*7;

a tak dále. Toto je obecnější než jen x:=~ + 1;Produkce optimálního kódu by zůstala provincií kompilátoru.

Sémantika

V programovacích jazycích orientovaných na výrazy, jako je C, jsou přiřazení a rozšířené přiřazení výrazy, které mají hodnotu. To umožňuje jejich použití ve složitých výrazech. To však může vést k obtížně čitelným nebo srozumitelným sekvencím symbolů, a co je ještě horší, nesprávný typ může snadno vytvořit jinou posloupnost blábolení, která, i když je kompilátor akceptuje, nepřináší požadované výsledky. V jiných jazycích, jako je Python, jsou přiřazení a rozšířené přiřazení příkazy, nikoli výrazy, a proto je nelze použít ve složitých výrazech. Následující příklad je například platný C, ale neplatný Python:

a += b += c

Stejně jako u přiřazení je v těchto jazycích rozšířené přiřazování formou přiřazování vpravo .

Na rozdíl od C se výrazy složeného přiřazení C ++ vyhodnocují na hodnotu l . Být lvalue umožňuje, aby byl zapsán na levou stranu jiného příkazu o přiřazení:

int x = 11;
(x *= 2) += 3; // Sets x to 25

Vypočítaná umístění přiřazení

V jazycích, jako je C, C ++ a Python, je rozšířené přiřazení, kde umístění přiřazení zahrnuje volání funkcí, povoleno volat funkce pouze jednou. Tzn. V prohlášení:

my_array[f1()] += 1

Funkce f1je nařízena, aby byla volána pouze jednou.

Pokud jazyk implementuje rozšířené přiřazení rozšířením makra na:

my_array[f1()] = my_array[f1()] + 1

Potom f1se volá dvakrát.

Podle jazyka

C potomci

V C , C ++ a C# je operátor přiřazení = , který je rozšířen následovně:

Operátor Popis
+= Přidání
-= Odčítání
*= Násobení
/= Divize
%= Modul
<<= Posun bitů vlevo
>>= Posun pravého bitu
&= Bitově AND
^= Bitově exkluzivní NEBO
|= Včetně bitů NEBO

Každý z nich se v uvedených jazycích nazývá operátor složeného přiřazení .

Podpůrné jazyky

Následující seznam, i když není úplný nebo úplný, uvádí některé z hlavních programovacích jazyků, které podporují operátory rozšířeného přiřazení.

Viz také

Reference

  1. ^ a b „Operátoři přiřazení“ . cppreference.com . Reference C ++ . Citováno 1. března 2021 .
  2. ^ Stroustrup, Bjarne (2013). Programovací jazyk C ++ (čtvrté vydání). Addison-Wesley. ISBN 978-0-321-56384-2.
  3. ^ "ISO/IEC 9899: 201x návrh výboru 12. dubna 2011 N1570" .
  4. ^ "Operátory přiřazení a složeného přiřazení" .
  5. ^ "Specifikace jazyka C#" . Microsoft . Citováno 17. března 2014 .