Умовний перехід — конструкція мови програмування, яка дозволяє виконувати різні дії залежно від булевого значення умови вказаної програмістом.
Найбільш часто умовний перехід має дві стадії: на першій відбувається порівняння між собою деяких величин, що визначають умову переходу, а на другій виконується сам перехід.
Необхідність коректної обробки умовних переходів накладає серйозний відбиток на логіку роботи сучасних конвеєрних процесорів. Умовні переходи можуть виконуватися двома способами. Виконувані переходи часто змінюють значення лічильника команд процесора на обчислене значення адреси переходу. Невиконувані — додають до значення лічильника команд число, рівне довжині поточної команди в байтах, для переходу до виконання наступної команди. Неправильне визначення типу умовного переходу може призводити до виникнення суттєвих затримок в роботі конвеєра і відповідно до великої втрати продуктивності комп'ютера.
Конструкція if—then(—else)
С-подібні мови
В мовах з C-подібним синтаксисом (C, , JavaScript) умовний перехід виглядає так:
if (умова) { // Дії виконуються, якщо умова виконана } else { // Дії виконуються, якщо умова не виконана }
Pascal
В мові програмування Pascal оператор умовного переходу виглядає так:
if умова then оператор 1 else оператор 2;
Цей розділ потребує доповнення. (січень 2018) |
Else if
Цей розділ потребує доповнення. (січень 2018) |
Вирази if—then—else
У багатьох мовах програмування підтримуються так звані if—вирази, що подібні до операторів умовного переходу, але повертають деяке значення.
Алголоподібні мови
[en] і деякі інші мови сімейства ALGOL дозволяють трактувати конструкцію if–then–else
як вираз:
myvariable := if x > 10 then 1 else 2
У наведеному прикладі змінній myvariable
буде надано значення в залежності від поточного значення змінної x
.
Lisp і діалекти
У діалектах мови Lisp — Scheme, Racket і Common Lisp — умовні вирази також присутні:
;; Scheme (define myvariable (if (> x 12) 1 2)) ; Надає змінній 'myvariable' значення 1 чи 2, залежно від значення 'x'
;; Common Lisp (let ((x 10)) (setq myvariable (if (> x 12) 2 4))) ; Надає 'myvariable' значення 2
Haskell
У мові Haskell (Haskell-98 і пізніші стандарти) існують лише if-вирази (умовних операторів немає), і частина else
є обов'язковою, через те, що кожен вираз повинен мати значення. Логіка програми, яка в інших мовах зазвичай виражається умовними операторами, у Haskell як правило реалізується за допомогою зіставлення зі шаблоном у рекурсивних функціях.
Мова Haskell реалізує ліниві обчислення, через це є можливим формулювати керуючі структури (такі як if) у вигляді звичайних виразів. Ліниві обчислення у цьому випадку означають, що if—функція обчислює лише вираз умови і відповідну гілку (if чи else), в той час як у мовах з обов'язковим обчисленням («не-лінивих») обчислюються всі три вирази. Приклад програми:
if' :: Bool -> a -> a -> a if' True x _ = x if' False _ y = y
C-подібні мови
Мова C і подібні їй мають спеціальну тернарну умовну операцію (?:
) для умовних виразів. Її сутність можна описати таким чином:
умова ? обчислюється_коли_умова_дійсна : обчислюється_коли_умова_недійсна
Таким чином, тернарна операція може бути вбудована у будь-який вираз, на відміну від умовного оператора. У C-подібних мовах вираз
my_variable = (x > 10) ? "foo" : "bar"; // In C-like languages
може бути порівняний з алголоподібними мовами, а також з тернарними операціями у мовах Ruby, Scala і подібних.
Умовний вираз, наведений вище, можна описати і за допомогою умовного оператора:
if (x > 10) my_variable = 'foo'; else my_variable = 'bar';
Думки програмістів різняться щодо того, яка форма умовної операції (вираз чи оператор) є простішою для читання і сприймання людиною, і чи генерує оператор більш ефективний код.
Арифметичний оператор if
У ранніх версіях мови програмування Фортран (до стандарту (Фортран 77)) був присутній так званий «арифметичний умовний оператор». Його можна розглядати як проміжну конструкцію між власне умовним оператором і оператором вибору. Ідея базується на математичній : x < 0, x = 0, x > 0. Цей оператор був найпершим умовним оператором у Фортрані:
IF (e) label1, label2, label3
де e
— будь-який числовий вираз (не обов'язково цілий). Даний оператор еквівалентний наступному:
IF (e .LT. 0) GOTO label1 IF (e .EQ. 0) GOTO label2 GOTO label3
Через те, що «арифметичний IF» еквівалентний трьом операторам GOTO
(які можуть переходити будь-куди у програмі), він вважається шкідливим у структурному програмуванні і не повинен використовуватися у нових програмах.
Див. також
Примітки
- The Inhibition of Potential Parallelism by Conditional Jumps. doi:10.1109/T-C.1972.223514.
- . Архів оригіналу за 19 січня 2018. Процитовано 19 січня 2018.
- Haskell 98 Language and Libraries: The Revised Report
- «If-then-else Proposal on HaskellWiki»
- Efficient C Tips #6 – Don’t use the ternary operator « Stack Overflow. Embeddedgurus.com. 18 лютого 2009. Процитовано 7 вересня 2012.
- . 3 квітня 1978. Архів оригіналу за 11 жовтня 2007. Процитовано 9 вересня 2007.
Це незавершена стаття про програмування. Ви можете проєкту, виправивши або дописавши її. |
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Umovnij perehid konstrukciya movi programuvannya yaka dozvolyaye vikonuvati rizni diyi zalezhno vid bulevogo znachennya umovi vkazanoyi programistom Blok shema Yaksho To Inakshe Vkladena blok shema Yaksho To Inakshe Najbilsh chasto umovnij perehid maye dvi stadiyi na pershij vidbuvayetsya porivnyannya mizh soboyu deyakih velichin sho viznachayut umovu perehodu a na drugij vikonuyetsya sam perehid Neobhidnist korektnoyi obrobki umovnih perehodiv nakladaye serjoznij vidbitok na logiku roboti suchasnih konveyernih procesoriv Umovni perehodi mozhut vikonuvatisya dvoma sposobami Vikonuvani perehodi chasto zminyuyut znachennya lichilnika komand procesora na obchislene znachennya adresi perehodu Nevikonuvani dodayut do znachennya lichilnika komand chislo rivne dovzhini potochnoyi komandi v bajtah dlya perehodu do vikonannya nastupnoyi komandi Nepravilne viznachennya tipu umovnogo perehodu mozhe prizvoditi do viniknennya suttyevih zatrimok v roboti konveyera i vidpovidno do velikoyi vtrati produktivnosti komp yutera Konstrukciya if then else S podibni movi V movah z C podibnim sintaksisom C C JavaScript umovnij perehid viglyadaye tak if umova Diyi vikonuyutsya yaksho umova vikonana else Diyi vikonuyutsya yaksho umova ne vikonana Pascal V movi programuvannya Pascal operator umovnogo perehodu viglyadaye tak if umova then operator 1 else operator 2 Cej rozdil potrebuye dopovnennya sichen 2018 Else if Cej rozdil potrebuye dopovnennya sichen 2018 Virazi if then else U bagatoh movah programuvannya pidtrimuyutsya tak zvani if virazi sho podibni do operatoriv umovnogo perehodu ale povertayut deyake znachennya Algolopodibni movi en i deyaki inshi movi simejstva ALGOL dozvolyayut traktuvati konstrukciyu if then else yak viraz myvariable if x gt 10 then 1 else 2 U navedenomu prikladi zminnij myvariable bude nadano znachennya v zalezhnosti vid potochnogo znachennya zminnoyi x Lisp i dialekti U dialektah movi Lisp Scheme Racket i Common Lisp umovni virazi takozh prisutni Scheme define myvariable if gt x 12 1 2 Nadaye zminnij myvariable znachennya 1 chi 2 zalezhno vid znachennya x Common Lisp let x 10 setq myvariable if gt x 12 2 4 Nadaye myvariable znachennya 2 Haskell U movi Haskell Haskell 98 i piznishi standarti isnuyut lishe if virazi umovnih operatoriv nemaye i chastina else ye obov yazkovoyu cherez te sho kozhen viraz povinen mati znachennya Logika programi yaka v inshih movah zazvichaj virazhayetsya umovnimi operatorami u Haskell yak pravilo realizuyetsya za dopomogoyu zistavlennya zi shablonom u rekursivnih funkciyah Mova Haskell realizuye linivi obchislennya cherez ce ye mozhlivim formulyuvati keruyuchi strukturi taki yak if u viglyadi zvichajnih viraziv Linivi obchislennya u comu vipadku oznachayut sho if funkciya obchislyuye lishe viraz umovi i vidpovidnu gilku if chi else v toj chas yak u movah z obov yazkovim obchislennyam ne linivih obchislyuyutsya vsi tri virazi Priklad programi if Bool gt a gt a gt a if True x x if False y y C podibni movi Mova C i podibni yij mayut specialnu ternarnu umovnu operaciyu dlya umovnih viraziv Yiyi sutnist mozhna opisati takim chinom umova obchislyuyetsya koli umova dijsna obchislyuyetsya koli umova nedijsna Takim chinom ternarna operaciya mozhe buti vbudovana u bud yakij viraz na vidminu vid umovnogo operatora U C podibnih movah viraz my variable x gt 10 foo bar In C like languages mozhe buti porivnyanij z algolopodibnimi movami a takozh z ternarnimi operaciyami u movah Ruby Scala i podibnih Umovnij viraz navedenij vishe mozhna opisati i za dopomogoyu umovnogo operatora if x gt 10 my variable foo else my variable bar Dumki programistiv riznyatsya shodo togo yaka forma umovnoyi operaciyi viraz chi operator ye prostishoyu dlya chitannya i sprijmannya lyudinoyu i chi generuye operator bilsh efektivnij kod Arifmetichnij operator if U rannih versiyah movi programuvannya Fortran do standartu Fortran 77 buv prisutnij tak zvanij arifmetichnij umovnij operator Jogo mozhna rozglyadati yak promizhnu konstrukciyu mizh vlasne umovnim operatorom i operatorom viboru Ideya bazuyetsya na matematichnij x lt 0 x 0 x gt 0 Cej operator buv najpershim umovnim operatorom u Fortrani IF e label1 label2 label3 de e bud yakij chislovij viraz ne obov yazkovo cilij Danij operator ekvivalentnij nastupnomu IF e LT 0 GOTO label1 IF e EQ 0 GOTO label2 GOTO label3 Cherez te sho arifmetichnij IF ekvivalentnij trom operatoram GOTO yaki mozhut perehoditi bud kudi u programi vin vvazhayetsya shkidlivim u strukturnomu programuvanni i ne povinen vikoristovuvatisya u novih programah Div takozhKomandi umovnogo perehoduPrimitkiThe Inhibition of Potential Parallelism by Conditional Jumps doi 10 1109 T C 1972 223514 Arhiv originalu za 19 sichnya 2018 Procitovano 19 sichnya 2018 Haskell 98 Language and Libraries The Revised Report If then else Proposal on HaskellWiki Efficient C Tips 6 Don t use the ternary operator Stack Overflow Embeddedgurus com 18 lyutogo 2009 Procitovano 7 veresnya 2012 3 kvitnya 1978 Arhiv originalu za 11 zhovtnya 2007 Procitovano 9 veresnya 2007 Ce nezavershena stattya pro programuvannya Vi mozhete dopomogti proyektu vipravivshi abo dopisavshi yiyi