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 += 1
x = 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 f1
je 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 f1
se 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é
- Operátory přírůstku a úbytku - speciální případ rozšířeného přiřazení do 1
- Rozšířená aritmetická operace IEEE 754
Reference
- ^ a b „Operátoři přiřazení“ . cppreference.com . Reference C ++ . Citováno 1. března 2021 .
- ^ Stroustrup, Bjarne (2013). Programovací jazyk C ++ (čtvrté vydání). Addison-Wesley. ISBN 978-0-321-56384-2.
- ^ "ISO/IEC 9899: 201x návrh výboru 12. dubna 2011 N1570" .
- ^ "Operátory přiřazení a složeného přiřazení" .
- ^ "Specifikace jazyka C#" . Microsoft . Citováno 17. března 2014 .