Присвоєння (англ. assignment) — механізм в програмуванні, що дозволяє динамічно змінювати зв'язки об'єктів даних (зазвичай, змінних) з їхніми значеннями. Строго кажучи, зміна значень є побічним ефектом операції присвоєння, і в багатьох сучасних мовах програмування сама операція також повертає певний результат (як правило, копію присвоєного значення). На фізичному рівні результат операції присвоєння полягає в проведенні запису і перезапису фрагментів пам'яті або регістрів процесора.
Присвоєння — одна з центральних конструкцій в імперативних мовах програмування, ефективно і просто реалізується на фон-Нейманівській архітектурі, яка лежить в основі сучасних комп'ютерів.
В логічному програмуванні прийнято інший, алгебраїчний підхід. Звичайного («деструктивного») присвоєння тут немає. Існують тільки невідомі, які ще не обчислені, і відповідні ідентифікатори для позначення цих невідомих. Програма тільки визначає їхні значення, самі вони сталі. Звичайно, в реалізації програма робить запис в пам'ять, але мови програмування цього не відображають, даючи програмісту можливість працювати з ідентифікаторами постійних значень, а не зі змінними.
В чистому функційному програмуванні не використовують змінні, тому явний оператор присвоєння не потрібен.
Визначення присвоєння
Загальний синтаксис простого присвоєння такий:
<вираз зліва> <оператор присвоєння> <вираз справа>
Результатом обчислення «Вираз зліва» має бути місце розташування об'єкта даних, або цільова змінна, ідентифікатор комірки пам'яті, куди буде здійснено запис. Такі посилання називаються «лівостороннім значеннями» (англ. lvalue). Типові приклади лівостороннього значення:
- ім'я змінної
x
- шлях до змінної в просторі імен і бібліотеках
Namespace.Library.Object.AnotherObject.Property
- шлях до масиву з виразом на місці індексу
this.a[i+j*k]
.
Нижче буде наведено складніші приклади.
«Вираз справа» має позначати в той чи інший спосіб величину, яку буде присвоєно об'єктові даних. Таким чином, навіть якщо в правій частині ім'я тієї ж змінної, що і ліворуч, інтерпретується воно інакше — такі посилання називаються «правостороннє значення» (англ. rvalue). Подальші обмеження на вираз накладає використана мова: так, в статично типізованих мовах воно повинно мати той же тип, що і цільова змінна, або тип, що можна привести до нього; в деяких мовах (наприклад, Сі або Python) у вираз може входити також інша операція присвоєння a=b=c
.
Оператором присвоєння в мовах програмування найчастіше виступають =
, :=
або ←
Але спеціальний синтаксис може і не вводиться — наприклад, в Tcl:
set <цільова_змінна> <вираз>
Цей запис еквівалентний виклику функції. Аналогічно, в Коболі старого стилю:
MULTIPLY 2 BY 2 GIVING FOUR.
Алгоритм роботи оператора присвоєння
- Обчислити значення першого операнда (ліва частина)
- На цьому етапі стає відомим місце знаходження цільового об'єкта, приймача нового значення.
- Обчислити значення другого операнда (права частина)
- Цей етап може бути як завгодно великим і включати інші оператори (у тому числі присвоєння).
- Присвоїти обчислене значення другого операнда першому
- По-перше, при конфлікті типів має бути здійснено їхнє приведення (або видане повідомлення про помилку зважаючи на його неможливості). По-друге, власне присвоювання значення в сучасних мовах програмування може бути підмінене і включати не тільки перенесення значень комірок пам'яті (наприклад, «властивості» об'єктів в C #, перевантаження операторів).
- Повернути значення другого операнда як результат виконання операції
- присутній не у всіх мовах (наприклад, не присутній в Паскалі).
Символ присвоєння
Вибір символу присвоєння викликає суперечки серед розробників мов. Існує думка, що використання символу =
для присвоєння заплутує програмістів, а також ставить складне питання про вибір символу для .
Так, Ніклаус Вірт стверджував :
Ця погана ідея відкидає вікову традицію використання знаку «=» для позначення порівняння на рівність, предиката, що приймає значення «істина» або «невірно».
Вибір символу оператора рівності в мові при використанні =
як присвоєння вирішується:
- Введенням нового символу мови для оператора перевірки на рівність.
Запис рівності у мові C ==
є джерелом помилок через можливість використання присвоєння в керівних конструкціях, але в інших мовах проблема вирішується введенням додаткових обмежень.
- Використанням цього ж символу, призначення визначають виходячи з контексту.
Наприклад, у виразі мовою (PL/I):
А = В = С
змінній А
присвоюється логічне значення виразу В = С
Такий запис погіршує сприйняття і рідко використовується.
Семантичні особливості
В імперативних мовах не завжди спосіб інтерпретації присвоєння «інтуїтивний», єдино вірний і можливий.
В імперативних мовах іноді неможливо зрозуміти за використовуваним синтаксисом як реалізується семантика присвоєння, якщо це явно не визначено в мові.
Наприклад, у мові Forth використовується присвоювання значення, коли дані між операціями, проходять через стек даних, при цьому сама операція не є покажчиком на дані, а лише виконує дії визначені операцією.
Унаслідок можна зробити присвоювання даних, сформованих (розташованих) далеко від операції присвоєння.
Приклад для сказаного вище:
\ Визначення змінної AAA і наступним рядком присвоєння їй значення 10 VARIABLE AAAA 10 AAA!
або так те ж саме (семантично):
10 VARIABLE AAA AAA!
Неоднозначність присвоєння
Розглянемо приклад:
X = 2 + 1
Це можна зрозуміти як «результат обчислення 2+1 (тобто 3) присвоюється змінній X
», або як «операція 2 + 1 присвоюється змінній X
». Якщо мова статично типізована, то двозначності немає, результат визначається типом змінної X
(«ціле число» або «операція»). У мові Пролог типізація динамічна, тому існують дві операції присвоєння: is
— присвоєння еквівалентного значення і =
— присвоєння зразка. У такому разі:
X is 2 + 1, X = 3 X = 2 + 1, X = 3
Перша послідовність буде визнана істинною, друга — хибною.
Семантика посилань
При роботі з об'єктами великих розмірів і складної структури багато мов використовують так звану «семантику . Це означає, що присвоєння в класичному розумінні не відбувається, але вважається, що значення цільової змінної розташовується на тому ж місці, що і значення вихідної. Наприклад (Python):
a = [1, 2, 3] b = a a [1] = 1000
Після цього b
матиме значення [1, 1000, 3]
— просто тому, що фактично його значення — це і є значення a
. Кількість посилань на один і той самий об'єкт даних називається його потужністю, а сам об'єкт зникає (знищується або усувається прибиральником сміття), коли його потужність досягає нуля. Мови програмування нижчого рівня (наприклад, Сі) дозволяють програмісту явно управляти тим, чи використовується семантика посилань або семантика копіювання.
Підміна операції
Багато мов надають можливість змінювати сенс присвоєння: або через механізм властивостей, або через перевантаження оператора присвоєння. Підміна може знадобиться для виконання перевірок на допустимість присвоюється значення або будь-яких інших додаткових операцій. Перевантаження оператора присвоєння часто використовується для забезпечення «глибокого копіювання», тобто копіювання значень, а не посилань, які в багатьох мовах копіюються за замовчуванням.
Такі механізми дозволяють забезпечити зручність при роботі, оскільки для програміста нема різниці між використанням вбудованого оператора і перевантаженого. З цієї ж причини можливі проблеми, тому що дії перевантаженого оператора можуть бути абсолютно відмінні від дій оператора за замовченням, а виклик функції не очевидний і легко може бути прийнятий за вбудовану операцію.
Розширення конструкції присвоєння
Оскільки операція присвоєння широко використовується, розробники мов програмування намагаються розробити нові конструкції для спрощеного запису типових операцій (додати в мову так званий «синтаксичний цукор»). Крім цього, в низькорівневих мовах програмування часто критерієм включення операції є можливість компіляції в ефективний виконуваний код. Особливо відома цією властивістю мова Сі.
Множинні цільові об'єкти
Однією з альтернатив простого оператора є можливість присвоєння значення виразу декільком об'єктам. Наприклад, у мові (PL/I) оператор
SUM, TOTAL = 0
одночасно присвоює нульове значення змінним SUM
і TOTAL
. В мові Ada присвоєння також є оператором, а не виразом, тому запис множинного присвоєння має вигляд:
SUM, TOTAL: Integer: = 0;
Аналогічне присвоєння в мові Python має такий синтаксис:
sum = total = 0
На відміну від PL/I, Ada та Python, де множинне присвоєння вважається тільки скороченою формою запису, в мовах C, Lisp та інших цей синтаксис має строгу основу: просто оператор присвоєння повертає присвоєне ним значення (див. вище). Таким чином, останній приклад — це насправді:
sum = (total = 0)
Рядок такого виду спрацює в Сі (якщо додати крапку з комою в кінці), але викличе помилку в Python.
Паралельне присвоєння
Для деяких мов, наприклад Ruby та Python, підтримують розширений синтаксис присвоєння, який називається паралельним присвоєнням:
a, b = 1, 11
Вважається, що таке присвоєння виконується одночасно і паралельно, що дозволяє коротко реалізувати за допомогою такої конструкції операцію обміну значень двох змінних.
запис з використанням паралельного присвоєння | «традиційне» присвоєння: вимагає додаткової змінної та трьох операцій | «економне» присвоєння: не вимагає додаткової змінної, але також містить три операції |
---|---|---|
a, b = b, a | | |
Деякі мови (наприклад, PHP) мають конструкції, що дозволяють зімітувати паралельне присвоювання:
list ($ a, $ b) = array ($ b, $ a);
Умовне присвоєння
Деякі мови програмування, наприклад, і Java, дозволяють умовне присвоєння. Наприклад, вираз: var = flag ? count1 : count2;
присвоїть змінній var
значення count1
, якщо flag
має значення «true» і count2
, якщо flag
«false».
Інший варіант умовного присвоєння (Ruby):
a || = 10
Дана конструкція присвоює змінній a
значення тільки в тому випадку, якщо значення ще не присвоєно або дорівнює false
Складені оператори присвоєння
Складений оператор присвоєння дозволяє скорочено задавати часто використовувану форму присвоєння. За допомогою цього способу можна скоротити запис присвоєння, при якому цільова змінна використовується як перший операнд в правій частині виразу, наприклад:
а = а + b
Синтаксис складного оператора присвоєння мови Сі є об'єднанням потрібного бінарного оператора і оператора =
Наприклад, такі записи еквівалентні
sum + = value; | sum = sum + value; |
У мовах програмування, що підтримують складені оператори (, C#, Python, Java та інші), звичайно існують версії для більшості бінарних операторів цих мов += -= &=
і т. ін.).
Унарні оператори присвоєння
У мові програмування С і більшості похідних від неї присутні два спеціальних унарних (тобто мають один аргумент) арифметичних оператора, які насправді є скороченим присвоєнням. Ці оператори поєднують операції збільшення та зменшення на одиницю з присвоєнням. Оператори ++
для збільшення і --
для зменшення можуть використовуватися як префіксні оператори (тобто перед операндами) або як постфіксні (тобто після операндів), означаючи різний порядок обчислення. Префіксний оператор інкременту повертає вже збільшене значення операнда, а постфіксний — оригінал.
Нижче наведений приклад використання оператора інкременту для формування завершеного оператора присвоєння
збільшення значення змінної на одиницю | еквівалентний розширений запис |
---|---|
count++; | count = count + 1; |
Хоч це і не виглядає присвоєнням, але є ним. Результат виконання наведеного вище оператора рівнозначний результату виконання присвоєння.
Оператори інкременту і декременту в мові Сі часто є скороченим записом для формування виразів, що містять індекси масивів.
Реалізація
Робота сучасних комп'ютерів складається зі зчитування даних з пам'яті в регістри, виконання операцій над цими даними і запису в пам'ять. Основною операцією тут є передача даних (з регістрів в пам'ять, з пам'яті в регістр, з регістра в регістр). Відповідно, вона виражається безпосередньо командами сучасних процесорів. Так, для архітектури x86 (усі наведені нижче команди відносяться також до даної архітектурі) це операція mov
та її різновиди для передачі даних різних розмірів. Операція присвоєння (передача даних з однієї комірки пам'яті в іншу) практично безпосередньо реалізується цією командою. Взагалі кажучи, для виконання передачі даних в пам'яті потрібно дві інструкції: передача з пам'яті в регістр і з регістра в пам'ять, але при використанні оптимізації в більшості випадків кількість команд можна скоротити.
mov eax, [ebp-4] # Завантажити 32-бітне значення з пам'яті mov [ebp+8], eax # Записати це значення за іншою адресою
Примітки
- Ніклаус Вірт. (2006). Хороші ідеї: погляд із Задзеркалля. Пер. Сергій Кузнецов. Процитовано 23 квітня 2006.
- З метою оптимізації багато операцій поєднуються в присвоювання. Для скорочених записів присвоєння найчастіше еквівалентне машинним інструкціях. Так, збільшення на одиницю реалізується машинної інструкцією
inc
зменшення на одиницю —dec
додавання з присвоєнням —add
віднімання з присвоєнням —sub
команди умовної пересилання —cmova cmovno
і т. д.
Див. також
Література
- Роберт В. Себеста. Основные концепции языков программирования = Concepts of Programming Languages. — 5-е изд. — М. : «Вільямс», 2001. — С. 275-298. — .
- М. Бен-Ари. Языки программирования. Практический сравнительный анализ. — М.: Мир, 2000. — 366 с. С. 71—74.
- В. Э. Вольфенгаген. Конструкции языков программирования. Приёмы описания. — М.: АО «Центр ЮрИнфоР», 2001. — 276 с. . С. 128—131.
- Э. А. Опалева, В. П. Самойленко. Языки программирования и методы трансляции. — СПб.: БХВ-Петербург, 2005. — 480 с. . С. 74—75.
- Т. Пратт, М. Зелковиц. Языки программирования: разработка и реализация. — 4-е изд. — СПб: Питер, 2002. — 688 с. , . С. 201—204.
Це незавершена стаття про мови програмування. Ви можете проєкту, виправивши або дописавши її. |
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Prisvoyennya angl assignment mehanizm v programuvanni sho dozvolyaye dinamichno zminyuvati zv yazki ob yektiv danih zazvichaj zminnih z yihnimi znachennyami Strogo kazhuchi zmina znachen ye pobichnim efektom operaciyi prisvoyennya i v bagatoh suchasnih movah programuvannya sama operaciya takozh povertaye pevnij rezultat yak pravilo kopiyu prisvoyenogo znachennya Na fizichnomu rivni rezultat operaciyi prisvoyennya polyagaye v provedenni zapisu i perezapisu fragmentiv pam yati abo registriv procesora Prisvoyennya odna z centralnih konstrukcij v imperativnih movah programuvannya efektivno i prosto realizuyetsya na fon Nejmanivskij arhitekturi yaka lezhit v osnovi suchasnih komp yuteriv V logichnomu programuvanni prijnyato inshij algebrayichnij pidhid Zvichajnogo destruktivnogo prisvoyennya tut nemaye Isnuyut tilki nevidomi yaki she ne obchisleni i vidpovidni identifikatori dlya poznachennya cih nevidomih Programa tilki viznachaye yihni znachennya sami voni stali Zvichajno v realizaciyi programa robit zapis v pam yat ale movi programuvannya cogo ne vidobrazhayut dayuchi programistu mozhlivist pracyuvati z identifikatorami postijnih znachen a ne zi zminnimi V chistomu funkcijnomu programuvanni ne vikoristovuyut zminni tomu yavnij operator prisvoyennya ne potriben Viznachennya prisvoyennyaZagalnij sintaksis prostogo prisvoyennya takij lt viraz zliva gt lt operator prisvoyennya gt lt viraz sprava gt Rezultatom obchislennya Viraz zliva maye buti misce roztashuvannya ob yekta danih abo cilova zminna identifikator komirki pam yati kudi bude zdijsneno zapis Taki posilannya nazivayutsya livostoronnim znachennyami angl lvalue Tipovi prikladi livostoronnogo znachennya im ya zminnoyi x shlyah do zminnoyi v prostori imen i bibliotekah Namespace Library Object AnotherObject Property shlyah do masivu z virazom na misci indeksu this a i j k Nizhche bude navedeno skladnishi prikladi Viraz sprava maye poznachati v toj chi inshij sposib velichinu yaku bude prisvoyeno ob yektovi danih Takim chinom navit yaksho v pravij chastini im ya tiyeyi zh zminnoyi sho i livoruch interpretuyetsya vono inakshe taki posilannya nazivayutsya pravostoronnye znachennya angl rvalue Podalshi obmezhennya na viraz nakladaye vikoristana mova tak v statichno tipizovanih movah vono povinno mati toj zhe tip sho i cilova zminna abo tip sho mozhna privesti do nogo v deyakih movah napriklad Si abo Python u viraz mozhe vhoditi takozh insha operaciya prisvoyennya a b c Operatorom prisvoyennya v movah programuvannya najchastishe vistupayut abo Ale specialnij sintaksis mozhe i ne vvoditsya napriklad v Tcl set lt cilova zminna gt lt viraz gt Cej zapis ekvivalentnij vikliku funkciyi Analogichno v Koboli starogo stilyu MULTIPLY 2 BY 2 GIVING FOUR Algoritm roboti operatora prisvoyennya Obchisliti znachennya pershogo operanda liva chastina Na comu etapi staye vidomim misce znahodzhennya cilovogo ob yekta prijmacha novogo znachennya Obchisliti znachennya drugogo operanda prava chastina Cej etap mozhe buti yak zavgodno velikim i vklyuchati inshi operatori u tomu chisli prisvoyennya Prisvoyiti obchislene znachennya drugogo operanda pershomu Po pershe pri konflikti tipiv maye buti zdijsneno yihnye privedennya abo vidane povidomlennya pro pomilku zvazhayuchi na jogo nemozhlivosti Po druge vlasne prisvoyuvannya znachennya v suchasnih movah programuvannya mozhe buti pidminene i vklyuchati ne tilki perenesennya znachen komirok pam yati napriklad vlastivosti ob yektiv v C perevantazhennya operatoriv Povernuti znachennya drugogo operanda yak rezultat vikonannya operaciyi prisutnij ne u vsih movah napriklad ne prisutnij v Paskali Simvol prisvoyennya Vibir simvolu prisvoyennya viklikaye superechki sered rozrobnikiv mov Isnuye dumka sho vikoristannya simvolu dlya prisvoyennya zaplutuye programistiv a takozh stavit skladne pitannya pro vibir simvolu dlya Tak Niklaus Virt stverdzhuvav Cya pogana ideya vidkidaye vikovu tradiciyu vikoristannya znaku dlya poznachennya porivnyannya na rivnist predikata sho prijmaye znachennya istina abo nevirno Vibir simvolu operatora rivnosti v movi pri vikoristanni yak prisvoyennya virishuyetsya Vvedennyam novogo simvolu movi dlya operatora perevirki na rivnist Zapis rivnosti u movi C ye dzherelom pomilok cherez mozhlivist vikoristannya prisvoyennya v kerivnih konstrukciyah ale v inshih movah problema virishuyetsya vvedennyam dodatkovih obmezhen Vikoristannyam cogo zh simvolu priznachennya viznachayut vihodyachi z kontekstu Napriklad u virazi movoyu PL I A V S zminnij A prisvoyuyetsya logichne znachennya virazu V S Takij zapis pogirshuye sprijnyattya i ridko vikoristovuyetsya Semantichni osoblivosti V imperativnih movah ne zavzhdi sposib interpretaciyi prisvoyennya intuyitivnij yedino virnij i mozhlivij V imperativnih movah inodi nemozhlivo zrozumiti za vikoristovuvanim sintaksisom yak realizuyetsya semantika prisvoyennya yaksho ce yavno ne viznacheno v movi Napriklad u movi Forth vikoristovuyetsya prisvoyuvannya znachennya koli dani mizh operaciyami prohodyat cherez stek danih pri comu sama operaciya ne ye pokazhchikom na dani a lishe vikonuye diyi viznacheni operaciyeyu Unaslidok mozhna zrobiti prisvoyuvannya danih sformovanih roztashovanih daleko vid operaciyi prisvoyennya Priklad dlya skazanogo vishe Viznachennya zminnoyi AAA i nastupnim ryadkom prisvoyennya yij znachennya 10 VARIABLE AAAA 10 AAA abo tak te zh same semantichno 10 VARIABLE AAA AAA Neodnoznachnist prisvoyennya Rozglyanemo priklad X 2 1 Ce mozhna zrozumiti yak rezultat obchislennya 2 1 tobto 3 prisvoyuyetsya zminnij X abo yak operaciya 2 1 prisvoyuyetsya zminnij X Yaksho mova statichno tipizovana to dvoznachnosti nemaye rezultat viznachayetsya tipom zminnoyi X cile chislo abo operaciya U movi Prolog tipizaciya dinamichna tomu isnuyut dvi operaciyi prisvoyennya is prisvoyennya ekvivalentnogo znachennya i prisvoyennya zrazka U takomu razi X is 2 1 X 3 X 2 1 X 3 Persha poslidovnist bude viznana istinnoyu druga hibnoyu Semantika posilan Pri roboti z ob yektami velikih rozmiriv i skladnoyi strukturi bagato mov vikoristovuyut tak zvanu semantiku Ce oznachaye sho prisvoyennya v klasichnomu rozuminni ne vidbuvayetsya ale vvazhayetsya sho znachennya cilovoyi zminnoyi roztashovuyetsya na tomu zh misci sho i znachennya vihidnoyi Napriklad Python a 1 2 3 b a a 1 1000 Pislya cogo b matime znachennya 1 1000 3 prosto tomu sho faktichno jogo znachennya ce i ye znachennya a Kilkist posilan na odin i toj samij ob yekt danih nazivayetsya jogo potuzhnistyu a sam ob yekt znikaye znishuyetsya abo usuvayetsya pribiralnikom smittya koli jogo potuzhnist dosyagaye nulya Movi programuvannya nizhchogo rivnya napriklad Si dozvolyayut programistu yavno upravlyati tim chi vikoristovuyetsya semantika posilan abo semantika kopiyuvannya Pidmina operaciyi Bagato mov nadayut mozhlivist zminyuvati sens prisvoyennya abo cherez mehanizm vlastivostej abo cherez perevantazhennya operatora prisvoyennya Pidmina mozhe znadobitsya dlya vikonannya perevirok na dopustimist prisvoyuyetsya znachennya abo bud yakih inshih dodatkovih operacij Perevantazhennya operatora prisvoyennya chasto vikoristovuyetsya dlya zabezpechennya glibokogo kopiyuvannya tobto kopiyuvannya znachen a ne posilan yaki v bagatoh movah kopiyuyutsya za zamovchuvannyam Taki mehanizmi dozvolyayut zabezpechiti zruchnist pri roboti oskilki dlya programista nema riznici mizh vikoristannyam vbudovanogo operatora i perevantazhenogo Z ciyeyi zh prichini mozhlivi problemi tomu sho diyi perevantazhenogo operatora mozhut buti absolyutno vidminni vid dij operatora za zamovchennyam a viklik funkciyi ne ochevidnij i legko mozhe buti prijnyatij za vbudovanu operaciyu Rozshirennya konstrukciyi prisvoyennyaKonstrukciyi prisvoyennya v riznih movah programuvannya Oskilki operaciya prisvoyennya shiroko vikoristovuyetsya rozrobniki mov programuvannya namagayutsya rozrobiti novi konstrukciyi dlya sproshenogo zapisu tipovih operacij dodati v movu tak zvanij sintaksichnij cukor Krim cogo v nizkorivnevih movah programuvannya chasto kriteriyem vklyuchennya operaciyi ye mozhlivist kompilyaciyi v efektivnij vikonuvanij kod Osoblivo vidoma ciyeyu vlastivistyu mova Si Mnozhinni cilovi ob yekti Odniyeyu z alternativ prostogo operatora ye mozhlivist prisvoyennya znachennya virazu dekilkom ob yektam Napriklad u movi PL I operator SUM TOTAL 0 odnochasno prisvoyuye nulove znachennya zminnim SUM i TOTAL V movi Ada prisvoyennya takozh ye operatorom a ne virazom tomu zapis mnozhinnogo prisvoyennya maye viglyad SUM TOTAL Integer 0 Analogichne prisvoyennya v movi Python maye takij sintaksis sum total 0 Na vidminu vid PL I Ada ta Python de mnozhinne prisvoyennya vvazhayetsya tilki skorochenoyu formoyu zapisu v movah C Lisp ta inshih cej sintaksis maye strogu osnovu prosto operator prisvoyennya povertaye prisvoyene nim znachennya div vishe Takim chinom ostannij priklad ce naspravdi sum total 0 Ryadok takogo vidu spracyuye v Si yaksho dodati krapku z komoyu v kinci ale vikliche pomilku v Python Paralelne prisvoyennya Dlya deyakih mov napriklad Ruby ta Python pidtrimuyut rozshirenij sintaksis prisvoyennya yakij nazivayetsya paralelnim prisvoyennyam a b 1 11 Vvazhayetsya sho take prisvoyennya vikonuyetsya odnochasno i paralelno sho dozvolyaye korotko realizuvati za dopomogoyu takoyi konstrukciyi operaciyu obminu znachen dvoh zminnih zapis z vikoristannyam paralelnogo prisvoyennya tradicijne prisvoyennya vimagaye dodatkovoyi zminnoyi ta troh operacij ekonomne prisvoyennya ne vimagaye dodatkovoyi zminnoyi ale takozh mistit tri operaciyi a b b a pre t a a b b t pre pre a a b b a b a a b pre Deyaki movi napriklad PHP mayut konstrukciyi sho dozvolyayut zimituvati paralelne prisvoyuvannya list a b array b a Umovne prisvoyennya Deyaki movi programuvannya napriklad C i Java dozvolyayut umovne prisvoyennya Napriklad viraz var flag count1 count2 prisvoyit zminnij var znachennya count1 yaksho flag maye znachennya true i count2 yaksho flag false Inshij variant umovnogo prisvoyennya Ruby a 10 Dana konstrukciya prisvoyuye zminnij a znachennya tilki v tomu vipadku yaksho znachennya she ne prisvoyeno abo dorivnyuye false Skladeni operatori prisvoyennya Skladenij operator prisvoyennya dozvolyaye skorocheno zadavati chasto vikoristovuvanu formu prisvoyennya Za dopomogoyu cogo sposobu mozhna skorotiti zapis prisvoyennya pri yakomu cilova zminna vikoristovuyetsya yak pershij operand v pravij chastini virazu napriklad a a b Sintaksis skladnogo operatora prisvoyennya movi Si ye ob yednannyam potribnogo binarnogo operatora i operatora Napriklad taki zapisi ekvivalentni sum value sum sum value U movah programuvannya sho pidtrimuyut skladeni operatori C C Python Java ta inshi zvichajno isnuyut versiyi dlya bilshosti binarnih operatoriv cih mov amp i t in Unarni operatori prisvoyennya U movi programuvannya S i bilshosti pohidnih vid neyi prisutni dva specialnih unarnih tobto mayut odin argument arifmetichnih operatora yaki naspravdi ye skorochenim prisvoyennyam Ci operatori poyednuyut operaciyi zbilshennya ta zmenshennya na odinicyu z prisvoyennyam Operatori dlya zbilshennya i dlya zmenshennya mozhut vikoristovuvatisya yak prefiksni operatori tobto pered operandami abo yak postfiksni tobto pislya operandiv oznachayuchi riznij poryadok obchislennya Prefiksnij operator inkrementu povertaye vzhe zbilshene znachennya operanda a postfiksnij original Nizhche navedenij priklad vikoristannya operatora inkrementu dlya formuvannya zavershenogo operatora prisvoyennya zbilshennya znachennya zminnoyi na odinicyu ekvivalentnij rozshirenij zapis count count count 1 Hoch ce i ne viglyadaye prisvoyennyam ale ye nim Rezultat vikonannya navedenogo vishe operatora rivnoznachnij rezultatu vikonannya prisvoyennya Operatori inkrementu i dekrementu v movi Si chasto ye skorochenim zapisom dlya formuvannya viraziv sho mistyat indeksi masiviv RealizaciyaRobota suchasnih komp yuteriv skladayetsya zi zchituvannya danih z pam yati v registri vikonannya operacij nad cimi danimi i zapisu v pam yat Osnovnoyu operaciyeyu tut ye peredacha danih z registriv v pam yat z pam yati v registr z registra v registr Vidpovidno vona virazhayetsya bezposeredno komandami suchasnih procesoriv Tak dlya arhitekturi x86 usi navedeni nizhche komandi vidnosyatsya takozh do danoyi arhitekturi ce operaciya mov ta yiyi riznovidi dlya peredachi danih riznih rozmiriv Operaciya prisvoyennya peredacha danih z odniyeyi komirki pam yati v inshu praktichno bezposeredno realizuyetsya ciyeyu komandoyu Vzagali kazhuchi dlya vikonannya peredachi danih v pam yati potribno dvi instrukciyi peredacha z pam yati v registr i z registra v pam yat ale pri vikoristanni optimizaciyi v bilshosti vipadkiv kilkist komand mozhna skorotiti mov eax ebp 4 Zavantazhiti 32 bitne znachennya z pam yati mov ebp 8 eax Zapisati ce znachennya za inshoyu adresoyuPrimitkiNiklaus Virt 2006 Horoshi ideyi poglyad iz Zadzerkallya Per Sergij Kuznecov Procitovano 23 kvitnya 2006 Z metoyu optimizaciyi bagato operacij poyednuyutsya v prisvoyuvannya Dlya skorochenih zapisiv prisvoyennya najchastishe ekvivalentne mashinnim instrukciyah Tak zbilshennya na odinicyu realizuyetsya mashinnoyi instrukciyeyu inc zmenshennya na odinicyu dec dodavannya z prisvoyennyam add vidnimannya z prisvoyennyam sub komandi umovnoyi peresilannya cmova cmovno i t d Div takozhPidstanovka Operator prisvoyennya C LiteraturaRobert V Sebesta Osnovnye koncepcii yazykov programmirovaniya Concepts of Programming Languages 5 e izd M Vilyams 2001 S 275 298 ISBN 0 201 75295 6 M Ben Ari Yazyki programmirovaniya Prakticheskij sravnitelnyj analiz M Mir 2000 366 s S 71 74 V E Volfengagen Konstrukcii yazykov programmirovaniya Priyomy opisaniya M AO Centr YurInfoR 2001 276 s ISBN 5 89158 079 9 S 128 131 E A Opaleva V P Samojlenko Yazyki programmirovaniya i metody translyacii SPb BHV Peterburg 2005 480 s ISBN 5 94157 327 8 S 74 75 T Pratt M Zelkovic Yazyki programmirovaniya razrabotka i realizaciya 4 e izd SPb Piter 2002 688 s ISBN 5 318 00189 0 ISBN 0 13 027678 2 S 201 204 Ce nezavershena stattya pro movi programuvannya Vi mozhete dopomogti proyektu vipravivshi abo dopisavshi yiyi