Умовний перехід — конструкція мови програмування, яка дозволяє виконувати різні дії залежно від булевого значення умови вказаної програмістом.
Найбільш часто умовний перехід має дві стадії: на першій відбувається порівняння між собою деяких величин, що визначають умову переходу, а на другій виконується сам перехід.
Необхідність коректної обробки умовних переходів накладає серйозний відбиток на логіку роботи сучасних конвеєрних процесорів. Умовні переходи можуть виконуватися двома способами. Виконувані переходи часто змінюють значення лічильника команд процесора на обчислене значення адреси переходу. Невиконувані — додають до значення лічильника команд число, рівне довжині поточної команди в байтах, для переходу до виконання наступної команди. Неправильне визначення типу умовного переходу може призводити до виникнення суттєвих затримок в роботі конвеєра і відповідно до великої втрати продуктивності комп'ютера.
Конструкція if—then(—else)
С-подібні мови В мовах з C-подібним синтаксисом (C, C++, JavaScript) умовний перехід виглядає так: if (умова) { // Дії виконуються, якщо умова виконана } else { // Дії виконуються, якщо умова не виконана }
Pascal В мові програмування Pascal оператор умовного переходу виглядає так: if умова then оператор 1 else оператор 2;
Else if
Вирази if—then—else У багатьох мовах програмування підтримуються так звані if—вирази, що подібні до операторів умовного переходу, але повертають деяке значення.
Алголоподібні мови і деякі інші мови сімейства 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 98 Language and Libraries: The Revised Report Логіка програми, яка в інших мовах зазвичай виражається умовними операторами, у Haskell як правило реалізується за допомогою зіставлення зі шаблоном у рекурсивних функціях.
Мова Haskell реалізує ліниві обчислення, через це є можливим формулювати керуючі структури (такі як if) у вигляді звичайних виразів. Ліниві обчислення у цьому випадку означають, що if—функція обчислює лише вираз умови і відповідну гілку (if чи else), в той час як у мовах з обов'язковим обчисленням («не-лінивих») обчислюються всі три вирази. Приклад програми:«If-then-else Proposal on HaskellWiki» 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) був присутній так званий «арифметичний умовний оператор». Його можна розглядати як проміжну конструкцію між власне умовним оператором і оператором вибору. Ідея базується на математичній трихотомії: . Цей оператор був найпершим умовним оператором у Фортрані:
IF (e) label1, label2, label3
де e — будь-який числовий вираз (не обов'язково цілий). Даний оператор еквівалентний наступному:
IF (e .LT. 0) GOTO label1 IF (e .EQ. 0) GOTO label2 GOTO label3
Через те, що «арифметичний IF» еквівалентний трьом операторам GOTO (які можуть переходити будь-куди у програмі), він вважається шкідливим у структурному програмуванні і не повинен використовуватися у нових програмах.
Див. також Команди умовного переходу
Примітки