Associativitat d'operadors
En la teoria del llenguatge de programació, l'associativitat d'un operador és una propietat que determina com s'agrupen els operadors de la mateixa precedència en absència de parèntesis. Si un operand està precedit i seguit d'operadors (per exemple, ^ 3 ^
), i aquests operadors tenen la mateixa prioritat, llavors l'operand es pot utilitzar com a entrada per a dues operacions diferents (és a dir, les dues operacions indicades pels dos operadors). L'elecció de quines operacions s'ha d'aplicar l'operand està determinada per l'associativitat dels operadors. Els operadors poden ser associatius (és a dir, que les operacions es poden agrupar arbitràriament), associatius a l'esquerra (és a dir, que les operacions s'agrupen des de l'esquerra), associatius a la dreta (és a dir, que les operacions s'agrupen des de la dreta) o no associatius (és a dir, que les operacions no es poden agrupar). encadenat, sovint perquè el tipus de sortida és incompatible amb els tipus d'entrada). L'associativitat i la precedència d'un operador és una part de la definició del llenguatge de programació; diferents llenguatges de programació poden tenir diferents associativitat i prioritat per al mateix tipus d'operador.[1][2]
Considereu l'expressió a ~ b ~ c
. Si l'operador ~
ha deixat l'associativitat, aquesta expressió s'interpretaria com (a ~ b) ~ c
. Si l'operador té associativitat correcta, l'expressió s'interpretaria com a ~ (b ~ c)
. Si l'operador no és associatiu, l'expressió pot ser un error de sintaxi o pot tenir algun significat especial. Alguns operadors matemàtics tenen associativitat inherent. Per exemple, la resta i la divisió, tal com s'utilitzen en la notació matemàtica convencional, són inherentment associatives a l'esquerra. La suma i la multiplicació, en canvi, són associatives tant d'esquerra com de dreta (p. ex. (a * b) * c = a * (b * c)
).[3]
Molts manuals de llenguatges de programació proporcionen una taula de precedència i associativitat dels operadors; vegeu, per exemple, la taula per a C i C++.
El concepte d'associativitat notacional descrit aquí està relacionat amb l'associativitat matemàtica, però diferent d'aquesta. Una operació que és matemàticament associativa, per definició, no requereix associativitat de notació. (Per exemple, l'addició té la propietat associativa, per tant no ha de ser ni associativa esquerra ni associativa dreta). Una operació que no sigui associativa matemàticament, però, ha de ser notacionalment esquerra, dreta o no associativa. (Per exemple, la resta no té la propietat associativa, per tant ha de tenir associativitat de notació).[4]
Exemples
[modifica]L'associativitat només és necessària quan els operadors d'una expressió tenen la mateixa prioritat. Normalment +
i -
tenen la mateixa precedència. Considereu l'expressió 7 - 4 + 2
. El resultat podria ser (7 - 4) + 2 = 5
o 7 - (4 + 2) = 1
. El primer resultat correspon al cas en què +
i -
són associatius a l'esquerra, el segon quan +
i -
són associatius a la dreta.
Per tal de reflectir l'ús normal, els operadors de suma, resta, multiplicació i divisió solen ser associatius a l'esquerra, mentre que per a un operador d'exponenciació (si n'hi ha) no hi ha un acord general. Tots els operadors d'assignació solen ser associatius a dret. Per evitar casos en què els operands s'associïn amb dos operadors, o amb cap operador, els operadors amb la mateixa precedència han de tenir la mateixa associativitat.
Referències
[modifica]- ↑ «What is associativity of operators and why is it important?» (en anglès). [Consulta: 11 agost 2024].
- ↑ «C++ Operator Precedence and Associativity» (en anglès). [Consulta: 11 agost 2024].
- ↑ «C Precedence And Associativity Of Operators: Definition and Examples» (en anglès). [Consulta: 11 agost 2024].
- ↑ TylerMSFT. «C++ built-in operators, precedence, and associativity» (en anglès americà), 03-08-2021. [Consulta: 11 agost 2024].