Кіріспе
Тең дәрежелі операторлардың топтастырылуын анықтайтын қасиет – ассоциативтілік математикалық ұғымы. Бағдарламалау тілі теориясында оператордың ассоциативтілігі – жақшалар қолданылмаған жағдайда бірдей басымдыққа ие операторлардың қалай топтастырылатынын анықтайтын қасиет. Егер оператордың сол және оң жағында операторлар болса (мысалы, ^ 3 ^), және бұл операторлардың басымдығы бірдей болса, онда оператор екі түрлі операцияның аргументі ретінде қолданылуы мүмкін (яғни екі оператор көрсеткен екі операция). Оператордың қай операцияларға қатысатыны операторлардың ассоциативтілігімен анықталады. Операторлар ассоциативті (операцияларды кез келген ретпен топтастыруға болады), солға ассоциативті (операциялар солдан оңға қарай топтастырылады), оңға ассоциативті (операциялар оңнан солға қарай топтастырылады) немесе ассоциативті емес (операцияларды тізбектеп беру мүмкін емес, себебі нәтиженің типі кіріс типімен сәйкес келмейді) болуы мүмкін. Оператордың ассоциативтілігі мен басымдығы – бағдарламалау тілінің анықтамасының бір бөлігі болып табылады. Әртүрлі бағдарламалау тілдері бірдей типтегі операторлар үшін әртүрлі ассоциативтілік пен басымдыққа ие болуы мүмкін. a ~ b ~ c өрнегін қарастырайық. Егер ~ операторы солға ассоциативті болса, бұл өрнек (a ~ b) ~ c ретінде түсіндіріледі. Егер оператор оңға ассоциативті болса, өрнек a ~ (b ~ c) ретінде түсіндіріледі. Егер оператор ассоциативті емес болса, өрнек синтаксистік қате болуы мүмкін немесе оның ерекше мағынасы болуы мүмкін. Кейбір математикалық операторлардың өзіндік ассоциативтілігі бар. Мысалы, дәстүрлі математикалық жазуда қолданылатын айыру және бөлу операциялары өзінен солға ассоциативті болып табылады. Ал қосу және көбейту операциялары солға да, оңға да ассоциативті. (мысалы, (a * b) * c = a * (b * c)). Көптеген бағдарламалау тілдерінің нұсқаулықтарында операторлардың басымдығы мен ассоциативтілігінің кестесі келтіріледі; мысалы, C және C++ тілдеріне арналған кестелерді қараңыз. Мұнда сипатталған нотациялық ассоциативтілік ұғымы математикалық ассоциативтілікпен байланысты, бірақ одан өзгеше. Математикалық ассоциативті операцияның анықтамасы бойынша, ешқандай нотациялық ассоциативтілік қажет емес. (Мысалы, қосудың ассоциативтік қасиеті бар, сондықтан оның солға немесе оңға ассоциативті болуы міндетті емес.) Дегенмен, математикалық ассоциативті емес операция нотациялық тұрғыдан солға, оңға немесе ассоциативті емес болуы керек. (Мысалы, айырудың ассоциативтік қасиеті жоқ, сондықтан оның нотациялық ассоциативтілігі болуы керек.)
In programming language theory, the associativity of an operator is a property that determines how operators of the same precedence are grouped in the absence of parentheses. If an operand is both preceded and followed by operators (for example, ^ 3 ^), and those operators have equal precedence, then the operand may be used as input to two different operations (i. e. the two operations indicated by the two operators). The choice of which operations to apply the operand to, is determined by the associativity of the operators. Operators may be associative (meaning the operations can be grouped arbitrarily), left associative (meaning the operations are grouped from the left), right associative (meaning the operations are grouped from the right) or non associative (meaning operations cannot be chained, often because the output type is incompatible with the input types). The associativity and precedence of an operator is a part of the definition of the programming language; different programming languages may have different associativity and precedence for the same type of operator. Consider the expression a ~ b ~ c. If the operator ~ has left associativity, this expression would be interpreted as (a ~ b) ~ c. If the operator has right associativity, the expression would be interpreted as a ~ (b ~ c). If the operator is non associative, the expression might be a syntax error, or it might have some special meaning. Some mathematical operators have inherent associativity. For example, subtraction and division, as used in conventional math notation, are inherently left associative. Addition and multiplication, by contrast, are both left and right associative. (e. g. (a * b) * c = a * (b * c)). Many programming language manuals provide a table of operator precedence and associativity; see, for example, the table for C and C++. The concept of notational associativity described here is related to, but different from, the mathematical associativity. An operation that is mathematically associative, by definition requires no notational associativity. (For example, addition has the associative property, therefore it does not have to be either left associative or right associative.) An operation that is not mathematically associative, however, must be notationally left , right , or non associative. (For example, subtraction does not have the associative property, therefore it must have notational associativity.)
Мысалдар
Ассоциативтілік тек қана өрнектегі операторлардың басымдығы бірдей болған кезде қажет болады. Әдетте, қосу (+) және алу (-) операторларының басымдығы бірдей болады. Мысалы, 7 - 4 + 2 өрнегін қарастырайық. Нәтижесі (7 - 4) + 2 = 5 немесе 7 - (4 + 2) = 1 болуы мүмкін. Бірінші нәтиже, алу (-) және қосу (+) операторлары сол жақтан ассоциативті болған жағдайда, екіншісі оң жақтан ассоциативті болған жағдайда сәйкес келеді. Қолданыстағы қағидаларды сақтау үшін, қосу, алу, көбейту және бөлу операторлары әдетте сол жақтан ассоциативті болады, ал дәрежелеу операторы үшін (болған жағдайда) жалпы келісім жоқ. Кез келген тағайындау операторлары әдетте оң жақтан ассоциативті болады. Операндар екі оператормен немесе ешқандай оператормен байланыстырылмауы үшін, бірдей басымдықты операторлардың бірдей ассоциативтілігі болуы тиіс.
Тапсыру операторларының оң жақ ассоциативтілігі
Көптеген императивті бағдарламалау тілдерінде тапсыру операторы оң жақты ассоциативті деп анықталады, ал тапсыру – тек мәлімдеме емес, мәнге бағаланатын өрнек деп анықталады. Бұл, келесі тапсыру өрнегінің оң операнды ретінде бір тапсыру өрнегінің мәнін пайдалану арқылы тізбектелген тапсыруға мүмкіндік береді. C тілінде a = b тапсыруы – a типіне түрлендірілген b өрнегінің мәніне тең бағаланатын өрнек, сонымен қатар b-ның R мәнін a-ның L мәніне сақтаудың жанама әсері бар. Сондықтан a = (b = c) өрнегі b = c; a = b; деп түсіндірілуі мүмкін. Ал (a = b) = c деген баламалы өрнек қате тудырады, себебі a = b – L мәнді өрнек емес, яғни оның R мәні бар, бірақ c-ның R мәнін сақтауға L мәні жоқ. = операторының оң жақты ассоциативтілігі a = b = c сияқты өрнектерді a = (b = c) деп түсіндіруге мүмкіндік береді. C++ тілінде a = b тапсыруы – a-ның R мәнін a-ның L мәніне сақтаудың жанама әсерімен a-ның өзінің мәніне тең бағаланатын өрнек болып табылады. Сондықтан a = (b = c) өрнегі b = c; a = b; деп түсіндірілуі мүмкін. Ал (a = b) = c деген баламалы өрнек қателік шығарудың орнына a = b; a = c; деп түсіндірілуі мүмкін. = операторының оң жақты ассоциативтілігі a = b = c сияқты өрнектерді a = (b = c) деп түсіндіруге мүмкіндік береді.
Қатыспайтын операторлар
Ассоциациялық емес операторлар – өрнекте тізбекпен қолданылғанда мінез-құлқы анықталмаған операторлар. Prolog-та infix операторы : ассоциациялық емес, себебі "a : b : c" сияқты құрылымдар синтаксистік қателерге әкеледі. Тағы бір мүмкіндік – кейбір операторлардың тізбектері басқаша түсіндірілуі мүмкін, оны ассоциативтілік арқылы көрсетуге болмайды. Әдетте, бұл синтаксистік тұрғыдан осы операциялардың тізбегі үшін ерекше ереже бар екенін және семантикалық тұрғыдан мінез-құлқы басқаша екенін білдіреді. Жақсы мысал – Python, онда мұндай құрылымдар көп. Тапсырмалар операциялар емес, операторлар болғандықтан, тағайындау операторының мәні жоқ және ассоциативті емес. Тізбектелген тапсырмалардың орнына a = b = c түріндегі тапсырмалар тізбегі үшін грамматикалық ереже қарастырылып, солдан оңға тағайындалады. Сонымен қатар, a = b += c сияқты тағайындау мен күшейтілген тағайындаудың комбинациялары Python-да рұқсат етілмейді, бірақ C-де рұқсат етіледі. Тағы бір мысал – >, == және <= сияқты салыстыру операторлары. a < b < c сияқты тізбектелген салыстыру (a < b) және (b < c) деп түсіндіріледі, бұл (a < b) < c немесе a < (b < c) тең емес.