В імперативному програмуванні точка перебігу (англ. sequence point) визначає будь-яку точку виконання програми, в якій гарантовано, що всі побічні ефекти попередніх обчислень вже виконані й жоден з побічних ефектів наступних обчислень ще не відбувся. Вони часто згадуються стосовно C і , бо результат деяких виразів залежить від послідовності виконання підвиразів. Додання однієї або більше точок перебігу це спосіб забезпечення послідовного результату, бо так обмежується можливий порядок обчислень.
Приклади двозначності
Уявімо дві функції f()
і g()
. В C і C++, оператор +
не пов'язується з точкою перебігу, отже в виразі f()+g()
можливо, що або f()
, або g()
виконається першою Оператор кома вводить точку перебігу, звідси в коді f(),g()
порядок обчислень: спочатку викликається f()
, а тоді g()
.
Точки перебігу вступають в гру коли одна й та сама змінна змінюється більше одного разу в одному виразі. Часто згадуваний приклад це С-вираз i=i++
. Кінцеве значення i
неоднозначне, бо, залежно від порядку обчислення, інкремент може вібутися до, після або паралельно з присвоєнням. Певна мова може визначати один з можливих способів поведінки або сказати, що поведінка невизначена. В C і C++, обчислення таких виразів породжує невизначену поведінку. У долішній заувазі стандарт вказує приклади виразів, які викличуть двозначність:
i = ++i + 1; a[i++] = i;
а ці дозволені:
i = i + 1; a[i] = i;
Точки перебігу в C і C++
В C і C++, точки перебігу зустрічаються в таких місцях. (В C++, перевантаження операторів так само як і функції, отже перевантажені оператори вводять точки перебігу так само як і виклики функцій.)
- Між обчисленням лівих і правих операндів && (логічний AND), || (логічний OR), і оператора кома. Наприклад, у виразі
*p++ != 0 && *q++ != 0
, всі побічні ефекти підвиразу*p++ != 0
завершуються до спроби доступу доq
. - Між обчисленням першого операнда тримісного й другим або третім оператором. Наприклад, у виразі
a = (*p++) ? (*p++) : 0
присутня точка перебігу між першим*p++
, тобто значення буде збільшено до часу як другий операнд буде виконано. - Наприкінці повного виразу. Ця категорія охоплює вирази інструкції (такі як надавання значення
a=b;
), інструкції повернення, керувальні виразиif
,switch
,while
або виразиdo
-while
, і всі три вирази в коді виразуfor
. - Перед входом у викликану функцію. Порядок обчислення аргументів не визначається, але ця точка перебігу значить, що всі їхні побічні ефекти завершуються до входу в функцію. У виразі
f(i++) + g(j++) + h(k++)
,f
викликається із початковим значеннямi
, алеi
збільшується до входу вf
. Схожим чином,j
іk
оновлюються перед входом уg
іh
відповідно. Однак, не вказано ні в якому порядку викликаютьсяf()
,g()
,h()
, ні в якому порядку збільшуютьсяi
,j
,k
. Змінніj
іk
в тіліf
можуть бути, а можуть не бути збільшеними. Зауважте, що викликf(a,b,c)
це не використання оператора коми і порядок обчисленняa
,b
іc
невизначений. - Коли відбувається повернення з функції, після того як значення до повернення копіюється в викликальний контекст. (Ця точка перебігу визначена лиш стандарті С++; вона тільки неявно присутня в C.)
- По завершені ініціалізатора; наприклад, після завершення обчислення
5
в оголошенніint a = 5;
.
Примітки
- Пункт 6.5#2 специфікації C99: "Між попередньою й наступною точкою перебігу значення збережене в об'єкті має змінитися через обчислення виразу не більше одного разу. Далі більше, доступ до попереднього значення може бути надано лише для визначення значення, що буде збережене."
- Додаток до специфікації C99 перелічує обставини за яких можуть бути присутні точкі перебігу.
- Стандарт С++ 1998 перелічує точки перебігу в розділі 1.9, параграфи 16–18.
- Стандарт C++, ISO 14882:2003, розділ 1.9, долішня заувага 11.
Це незавершена стаття про програмування. Ви можете проєкту, виправивши або дописавши її. |
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
V imperativnomu programuvanni tochka perebigu angl sequence point viznachaye bud yaku tochku vikonannya programi v yakij garantovano sho vsi pobichni efekti poperednih obchislen vzhe vikonani j zhoden z pobichnih efektiv nastupnih obchislen she ne vidbuvsya Voni chasto zgaduyutsya stosovno C i C bo rezultat deyakih viraziv zalezhit vid poslidovnosti vikonannya pidviraziv Dodannya odniyeyi abo bilshe tochok perebigu ce sposib zabezpechennya poslidovnogo rezultatu bo tak obmezhuyetsya mozhlivij poryadok obchislen Prikladi dvoznachnostiUyavimo dvi funkciyi f i g V C i C operator ne pov yazuyetsya z tochkoyu perebigu otzhe v virazi f g mozhlivo sho abo f abo g vikonayetsya pershoyu Operator koma vvodit tochku perebigu zvidsi v kodi f g poryadok obchislen spochatku viklikayetsya f a todi g Tochki perebigu vstupayut v gru koli odna j ta sama zminna zminyuyetsya bilshe odnogo razu v odnomu virazi Chasto zgaduvanij priklad ce S viraz i i Kinceve znachennya i neodnoznachne bo zalezhno vid poryadku obchislennya inkrement mozhe vibutisya do pislya abo paralelno z prisvoyennyam Pevna mova mozhe viznachati odin z mozhlivih sposobiv povedinki abo skazati sho povedinka neviznachena V C i C obchislennya takih viraziv porodzhuye neviznachenu povedinku U dolishnij zauvazi standart vkazuye prikladi viraziv yaki viklichut dvoznachnist i i 1 a i i a ci dozvoleni i i 1 a i i Tochki perebigu v C i C V C i C tochki perebigu zustrichayutsya v takih miscyah V C perevantazhennya operatoriv tak samo yak i funkciyi otzhe perevantazheni operatori vvodyat tochki perebigu tak samo yak i vikliki funkcij Mizh obchislennyam livih i pravih operandiv amp amp logichnij AND logichnij OR i operatora koma Napriklad u virazi p 0 amp amp q 0 vsi pobichni efekti pidvirazu p 0 zavershuyutsya do sprobi dostupu do q Mizh obchislennyam pershogo operanda trimisnogo j drugim abo tretim operatorom Napriklad u virazi a p p 0 prisutnya tochka perebigu mizh pershim p tobto znachennya bude zbilsheno do chasu yak drugij operand bude vikonano Naprikinci povnogo virazu Cya kategoriya ohoplyuye virazi instrukciyi taki yak nadavannya znachennya a b instrukciyi povernennya keruvalni virazi if switch while abo virazi do while i vsi tri virazi v kodi virazu a href wiki D0 A6 D0 B8 D0 BA D0 BB D0 BF D1 80 D0 BE D0 B3 D1 80 D0 B0 D0 BC D1 83 D0 B2 D0 B0 D0 BD D0 BD D1 8F title Cikl programuvannya for a Pered vhodom u viklikanu funkciyu Poryadok obchislennya argumentiv ne viznachayetsya ale cya tochka perebigu znachit sho vsi yihni pobichni efekti zavershuyutsya do vhodu v funkciyu U virazi f i g j h k f viklikayetsya iz pochatkovim znachennyam i ale i zbilshuyetsya do vhodu v f Shozhim chinom j i k onovlyuyutsya pered vhodom u g i h vidpovidno Odnak ne vkazano ni v yakomu poryadku viklikayutsya f g h ni v yakomu poryadku zbilshuyutsya i j k Zminni j i k v tili f mozhut buti a mozhut ne buti zbilshenimi Zauvazhte sho viklik f a b c ce ne vikoristannya operatora komi i poryadok obchislennya a b i c neviznachenij Koli vidbuvayetsya povernennya z funkciyi pislya togo yak znachennya do povernennya kopiyuyetsya v viklikalnij kontekst Cya tochka perebigu viznachena lish standarti S vona tilki neyavno prisutnya v C Po zaversheni inicializatora napriklad pislya zavershennya obchislennya 5 v ogoloshenni int a 5 PrimitkiPunkt 6 5 2 specifikaciyi C99 Mizh poperednoyu j nastupnoyu tochkoyu perebigu znachennya zberezhene v ob yekti maye zminitisya cherez obchislennya virazu ne bilshe odnogo razu Dali bilshe dostup do poperednogo znachennya mozhe buti nadano lishe dlya viznachennya znachennya sho bude zberezhene Dodatok do specifikaciyi C99 perelichuye obstavini za yakih mozhut buti prisutni tochki perebigu Standart S 1998 perelichuye tochki perebigu v rozdili 1 9 paragrafi 16 18 Standart C ISO 14882 2003 rozdil 1 9 dolishnya zauvaga 11 Ce nezavershena stattya pro programuvannya Vi mozhete dopomogti proyektu vipravivshi abo dopisavshi yiyi