Кіріспе

Тең дәрежелі операторлардың топтастырылуын анықтайтын қасиет – ассоциативтілік математикалық ұғымы. Бағдарламалау тілі теориясында оператордың ассоциативтілігі – жақшалар қолданылмаған жағдайда бірдей басымдыққа ие операторлардың қалай топтастырылатынын анықтайтын қасиет. Егер оператордың сол және оң жағында операторлар болса (мысалы, ^ 3 ^), және бұл операторлардың басымдығы бірдей болса, онда оператор екі түрлі операцияның аргументі ретінде қолданылуы мүмкін (яғни екі оператор көрсеткен екі операция). Оператордың қай операцияларға қатысатыны операторлардың ассоциативтілігімен анықталады. Операторлар ассоциативті (операцияларды кез келген ретпен топтастыруға болады), солға ассоциативті (операциялар солдан оңға қарай топтастырылады), оңға ассоциативті (операциялар оңнан солға қарай топтастырылады) немесе ассоциативті емес (операцияларды тізбектеп беру мүмкін емес, себебі нәтиженің типі кіріс типімен сәйкес келмейді) болуы мүмкін. Оператордың ассоциативтілігі мен басымдығы – бағдарламалау тілінің анықтамасының бір бөлігі болып табылады. Әртүрлі бағдарламалау тілдері бірдей типтегі операторлар үшін әртүрлі ассоциативтілік пен басымдыққа ие болуы мүмкін. a ~ b ~ c өрнегін қарастырайық. Егер ~ операторы солға ассоциативті болса, бұл өрнек (a ~ b) ~ c ретінде түсіндіріледі. Егер оператор оңға ассоциативті болса, өрнек a ~ (b ~ c) ретінде түсіндіріледі. Егер оператор ассоциативті емес болса, өрнек синтаксистік қате болуы мүмкін немесе оның ерекше мағынасы болуы мүмкін. Кейбір математикалық операторлардың өзіндік ассоциативтілігі бар. Мысалы, дәстүрлі математикалық жазуда қолданылатын айыру және бөлу операциялары өзінен солға ассоциативті болып табылады. Ал қосу және көбейту операциялары солға да, оңға да ассоциативті. (мысалы, (a * b) * c = a * (b * c)). Көптеген бағдарламалау тілдерінің нұсқаулықтарында операторлардың басымдығы мен ассоциативтілігінің кестесі келтіріледі; мысалы, C және C++ тілдеріне арналған кестелерді қараңыз. Мұнда сипатталған нотациялық ассоциативтілік ұғымы математикалық ассоциативтілікпен байланысты, бірақ одан өзгеше. Математикалық ассоциативті операцияның анықтамасы бойынша, ешқандай нотациялық ассоциативтілік қажет емес. (Мысалы, қосудың ассоциативтік қасиеті бар, сондықтан оның солға немесе оңға ассоциативті болуы міндетті емес.) Дегенмен, математикалық ассоциативті емес операция нотациялық тұрғыдан солға, оңға немесе ассоциативті емес болуы керек. (Мысалы, айырудың ассоциативтік қасиеті жоқ, сондықтан оның нотациялық ассоциативтілігі болуы керек.)

Мысалдар

Ассоциативтілік тек қана өрнектегі операторлардың басымдығы бірдей болған кезде қажет болады. Әдетте, қосу (+) және алу (-) операторларының басымдығы бірдей болады. Мысалы, 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) тең емес.