Förstärkt uppdrag

Augmented assignment (eller sammansatt tilldelning ) är namnet som ges till vissa uppdragsoperatörer i vissa programmeringsspråk (särskilt de som härrör från C ) . En utökad tilldelning används vanligtvis för att ersätta en sats där en operator tar en variabel som ett av sina argument och sedan tilldelar resultatet tillbaka till samma variabel. Ett enkelt exempel är x += 1 som expanderas till x = x + 1 . Liknande konstruktioner är ofta tillgängliga för olika binära operatorer.

I allmänhet, på språk som erbjuder den här funktionen, har de flesta operatorer som kan ta en variabel som ett av sina argument och returnera ett resultat av samma typ en utökad tilldelningsekvivalent som tilldelar resultatet tillbaka till variabeln på plats, inklusive aritmetiska operatorer, bitförskjutning operatorer och bitvisa operatorer .

Diskussion

Till exempel kan följande uttalande eller någon variant av det hittas i många program:

x = x + 1

Det betyder "hitta talet som är lagrat i variabeln x , lägg till 1 till det och lagra resultatet av tillägget i variabeln x ." Så enkelt som detta verkar, kan det ha en ineffektivitet, eftersom platsen för variabel x måste slås upp två gånger om kompilatorn inte känner igen att två delar av uttrycket är identiska: x kan vara en referens till något matriselement eller annan komplexitet. I jämförelse, här är den utökade uppdragsversionen:

x += 1

Med den här versionen finns det ingen ursäkt för att en kompilator misslyckas med att generera kod som slår upp platsen för variabel x bara en gång och modifierar den på plats, om naturligtvis maskinkoden stöder en sådan sekvens. Till exempel, om x är en enkel variabel, maskinkodsekvensen vara något liknande

Ladda x Lägg till 1 Butik x

och samma kod skulle genereras för båda formerna. Men om det finns en speciell op-kod kan det vara det

MDM x,1

betyder "Ändra minne" genom att lägga till 1 till x, och en optimerande kompilator skulle generera samma kod för båda formerna. Vissa maskinkoder erbjuder INC- och DEC-operationer (för att addera eller subtrahera en), andra kan tillåta andra konstanter än en.

Mer generellt är formen

 x  ?  = uttryck 

var ? står för någon operatör (inte alltid + ), och det kanske inte finns några speciella op-koder som hjälper. Det finns fortfarande möjligheten att om x är en komplicerad enhet kommer kompilatorn att uppmuntras att undvika dubbelarbete vid åtkomst till x , och naturligtvis, om x är ett långt namn, kommer det att behövas mindre skrivning. Den sistnämnda var grunden för den liknande funktionen i ALGOL- kompilatorerna som erbjuds via Burroughs B6700- systemen, med hjälp av tilde-symbolen för att stå för variabeln som tilldelas, så att

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

skulle bli

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

och så vidare. Detta är mer allmänt än bara x:=~ + 1; Att producera optimal kod skulle förbli kompilatorns provins.

Semantik

I uttrycksorienterade programmeringsspråk som C är tilldelning och utökad tilldelning uttryck, som har ett värde. Detta gör att de kan användas i komplexa uttryck. Detta kan dock producera sekvenser av symboler som är svåra att läsa eller förstå, och ännu värre, en felskrivning kan lätt producera en annan sekvens av skratt som, även om det accepteras av kompilatorn, inte ger önskade resultat. På andra språk, som Python, är tilldelning och utökad tilldelning satser, inte uttryck, och kan därför inte användas i komplexa uttryck. Till exempel är följande giltig C, men inte giltig Python:

     a  +=  b  +=  c 

Precis som med uppdrag är utökad uppdrag i dessa språk en form av rättighetsassociativ uppdrag .

Till skillnad från i C, evalueras de sammansatta tilldelningsuttrycken för C++ till ett lvärde . Genom att vara ett lvärde kan det skrivas till vänster om någon annan uppgiftssats:

   
      int  x  =  11  ;  (  x  *=  2  )  +=  3  ;  // Sätter x till 25 

Beräknade uppdragsplatser

I språk som C, C++ och Python är en utökad uppgift där uppdragsplatsen inkluderar funktionsanrop, mandat att endast anropa funktionerna en gång. Dvs i uttalandet:

   min_array  [  f1  ()]  +=  1 

Funktionen f1 måste endast anropas en gång .

Om ett språk implementerar utökad tilldelning genom makroexpansion till:

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

Då anropas f1 två gånger.

Efter språk

C ättlingar

I C , C++ och C# är tilldelningsoperatorn = , vilket utökas enligt följande:

Operatör Beskrivning
+= Tillägg
-= Subtraktion
*= Multiplikation
/= Division
%= Modul
<<= Vänster bitskifte
>>= Höger bitsförskjutning
&= Bitvis OCH
^= Bitvis exklusivt ELLER
|= Bitvis inklusive ELLER

Var och en av dessa kallas en sammansatt tilldelningsoperator på nämnda språk.

Stödspråk

Följande lista, även om den inte är komplett eller heltäckande, listar några av de stora programmeringsspråken som stöder utökade uppdragsoperatörer.

Se även

  1. ^ a b "Uppdragsoperatörer" . cppreference.com . C++ referens . Hämtad 1 mars 2021 .
  2. ^   Stroustrup, Bjarne (2013). Programmeringsspråket C++ (fjärde upplagan). Addison-Wesley. ISBN 978-0-321-56384-2 .
  3. ^ "ISO/IEC 9899:201x kommittéutkast 12 april 2011 N1570" .
  4. ^ "Tilldelnings- och sammansatta uppdragsoperatörer" .
  5. ^ "C#-språkspecifikation" . Microsoft . Hämtad 17 mars 2014 .