Условное (компьютерное программирование)
В информатике условные выражения (то есть условные операторы , условные выражения и условные конструкции ) — это конструкции языка программирования , которые выполняют различные вычисления или действия или возвращают разные значения в зависимости от значения логического выражения, называемого условием .
Условные выражения обычно реализуются путем выборочного выполнения инструкций. Хотя динамическая диспетчеризация обычно не классифицируется как условная конструкция, это еще один способ выбора между альтернативами во время выполнения .
Терминология
[ редактировать ]Условные операторы — это императивные конструкции, выполняемые для побочного эффекта, тогда как условные выражения возвращают значения. Многие языки программирования (например, C) имеют отдельные условные операторы и условные выражения. Хотя в чистом функциональном программировании условные выражения не имеют побочных эффектов , многие языки с условными выражениями (например, Lisp) поддерживают условные побочные эффекты.
Если-то(-иначе)
[ редактировать ]The if–then
или if–then–else
Конструкция используется во многих языках программирования. Хотя синтаксис варьируется от языка к языку, базовая структура (в форме псевдокода ) выглядит следующим образом:
If (Boolean condition) Then (consequent) Else (alternative) End If
Например:
If stock=0 Then message= order new stock Else message= there is stock End If
В приведенном выше примере кода часть, представленная (логическим условием), представляет собой условное выражение , имеющее внутреннее значение (например, оно может быть заменено любым из значений True
или False
), но не имеющее внутреннего смысла. Напротив, сочетание этого выражения, If
и Then
окружающее его и последующее после него следствие составляют условное утверждение , имеющее внутреннее значение (например, выражающее связное логическое правило), но не имеющее внутренней ценности.
Когда переводчик находит If
, он ожидает логическое условие – например, x > 0
, что означает «переменная x содержит число больше нуля» — и оценивает это условие. Если условие true
, заявления, следующие за then
выполняются. В противном случае выполнение продолжается в следующей ветке – либо в else
блок (который обычно является необязательным), или если нет else
ветка, затем после end If
.
После выполнения любой из ветвей управление возвращается в точку после end If
.
История и развитие
[ редактировать ]В ранних языках программирования, особенно в некоторых диалектах BASIC, 1980-х годов используемых в домашних компьютерах , if–then
заявление могло содержать только GOTO
операторы (эквивалент инструкции ветвления ). Это привело к появлению трудночитаемого стиля программирования, известного как программирование спагетти , а программы в этом стиле называются кодом спагетти . В результате появилось структурированное программирование , которое позволяет (практически) помещать произвольные операторы в блоки операторов внутри if
утверждение, набиравшее популярность, пока не стало нормой даже в большинстве кругов программирования на языке BASIC. Такие механизмы и принципы были основаны на более старом, но более совершенном ALGOL семействе языков , а языки, подобные ALGOL, такие как Pascal и Modula-2, в течение многих лет влияли на современные варианты BASIC. Хотя это возможно при использовании только GOTO
заявления в if–then
операторы для написания программ, которые не являются спагетти-кодом и так же хорошо структурированы и читабельны, как и программы, написанные на языке структурированного программирования. Структурное программирование упрощает эту задачу и обеспечивает ее соблюдение. Структурированный if–then–else
Операторы, подобные приведенному выше примеру, являются одним из ключевых элементов структурного программирования и присутствуют в большинстве популярных языков программирования высокого уровня, таких как C , Java , JavaScript и Visual Basic .
Проблема «висящего еще»
[ редактировать ]The else
ключевое слово создано для таргетинга на конкретную if–then
предшествующий ему оператор, но для вложенных if–then
классические языки программирования, такие как АЛГОЛ 60, изо всех сил пытались определить, на какой конкретный оператор ориентироваться. Без четких границ, какое утверждение является каким, else
ключевое слово может быть нацелено на любое предыдущее if–then
оператор в гнезде после анализа.
if a then if b then s else s2
можно проанализировать как
if a then (if b then s) else s2
или
if a then (if b then s else s2)
в зависимости от того, else
связано с первым if
или второй if
. Это известно как проблема висячего else и решается различными способами, в зависимости от языка (обычно через end if
заявление или {...}
скобки).
Иначе, если
[ редактировать ]Используя else if
, можно объединить несколько условий. Будут выполняться только операторы, следующие за первым условием, которое окажется истинным. Все остальные операторы будут пропущены.
if condition then -- statements elseif condition then -- more statements elseif condition then -- more statements; ... else -- other statements; end if;
Например, для магазина, предлагающего скидку до 30% на товар:
if discount < 11% then print (you have to pay $30) elseif discount<21% then print (you have to pay $20) elseif discount<31% then print (you have to pay $10) end if;
В приведенном выше примере, если скидка составляет 10%, то первое утверждение if будет оценено как истинное и будет распечатано «вы должны заплатить 30 долларов». Все остальные операторы ниже первого оператора if будут пропущены.
The elseif
в языке Ada утверждение, например, , является просто синтаксическим сахаром для else
с последующим if
. В Аде отличие в том, что только один end if
необходим, если кто-то использует elseif
вместо else
с последующим if
. PHP использует elseif
ключевое слово [1] как для фигурных скобок, так и для синтаксиса двоеточия. Perl предоставляет ключевое слово elsif
чтобы избежать большого количества скобок, которые потребуются для нескольких if
и else
заявления. Python использует специальное ключевое слово elif
поскольку структура обозначается отступами, а не фигурными скобками, поэтому повторное использование else
и if
потребует увеличения отступов после каждого условия. Некоторые реализации BASIC , такие как Visual Basic , [2] использовать ElseIf
слишком. Аналогичным образом, более ранние оболочки UNIX (позже объединенные в синтаксис оболочки POSIX) [3] ) также используйте elif, но предоставляя возможность разделения пробелами, разрывами строк или тем и другим.
Однако во многих языках, более прямых потомках Алгола, таких как Simula , Pascal , BCPL и C , этот специальный синтаксис для else if
Конструкция не присутствует и не присутствует во многих синтаксических производных от C, таких как Java , ECMAScript и т. д. Это работает, потому что в этих языках любое отдельное утверждение (в данном случае if cond
...) может следовать за условием, не заключаясь в блок.
Этот выбор дизайна имеет небольшую «стоимость». Каждый else if
ветка фактически добавляет дополнительный уровень вложенности. Это усложняет работу компилятора (или людей, которые его пишут), поскольку компилятор должен анализировать и реализовывать сколь угодно длинные else if
цепочки рекурсивно.
Если все термины в последовательности условных операторов проверяют значение одного выражения (например, if x=0
... else if x=1
... else if x=2
...), альтернативой является оператор переключения , также называемый оператором случая или оператором выбора. И наоборот, в языках, в которых нет оператора переключения, они могут быть созданы с помощью последовательности else if
заявления.
Выражения if-then-else
[ редактировать ]Многие языки поддерживают выражения if , которые похожи на операторы if, но в результате возвращают значение. Таким образом, это истинные выражения (которые оцениваются как значения), а не операторы (которые могут быть недопустимы в контексте значения).
Семья Алголь
[ редактировать ]АЛГОЛ 60 и некоторые другие члены семейства АЛГОЛ позволяют if–then–else
как выражение:
myvariable := if x > 20 then 1 else 2
Диалекты Лиспа
[ редактировать ]В диалектах Лиспа — Scheme , Racket и Common Lisp — первый из которых в значительной степени был вдохновлен АЛГОЛом:
;; Scheme
(define myvariable (if (> x 12) 1 2)) ; Assigns 'myvariable' to 1 or 2, depending on the value of 'x'
;; Common Lisp
(let ((x 10))
(setq myvariable (if (> x 12) 2 4))) ; Assigns 'myvariable' to 2
Хаскелл
[ редактировать ]В Haskell 98 есть только выражение if , оператор no if и оператор if. else
часть является обязательной, поскольку каждое выражение должно иметь некоторое значение. [4] Логика, которая на других языках выражалась бы с помощью условий, обычно выражается с помощью сопоставления с образцом в рекурсивных функциях.
Поскольку Haskell ленив , можно писать управляющие структуры, например if , как обычные выражения; ленивая оценка означает, что функция if может оценивать только условие и правильную ветвь (тогда как строгий язык оценивал бы все три). Это можно написать так: [5]
if' :: Bool -> a -> a -> a
if' True x _ = x
if' False _ y = y
C-подобные языки
[ редактировать ]В языках C и C-подобных есть специальный тернарный оператор ( ?: ) для условных выражений с функцией, которая может быть описана таким шаблоном:
condition ? evaluated-when-true : evaluated-when-false
Это означает, что его можно встраивать в выражения, в отличие от операторов if, в C-подобных языках:
my_variable = x > 10 ? "foo" : "bar"; // In C-like languages
if-then-else семейства Алголя которые можно сравнить с выражениями (в отличие от оператора ) (и похожими, среди прочего, в Ruby и Scala).
Чтобы добиться того же с помощью оператора if, потребуется более одной строки кода (в соответствии с типичными соглашениями о макете) и дважды упомянуть «my_variable»:
if (x > 10)
my_variable = "foo";
else
my_variable = "bar";
Некоторые утверждают, что явный оператор if/then легче читать и что он может скомпилироваться в более эффективный код, чем тернарный оператор. [6] в то время как другие утверждают, что краткие выражения легче читать, чем утверждения, разбитые на несколько строк и содержащие повторения.
x = TextWindow.ReadNumber()
If (x > 10) Then
TextWindow.WriteLine("My variable is named 'foo'.")
Else
TextWindow.WriteLine("My variable is named 'bar'.")
EndIf
Во-первых, когда пользователь запускает программу, появляется курсор, ожидающий, пока читатель наберет число. Если это число больше 10, появится текст «Моя переменная называется «foo». отображается на экране. Если число меньше 10, появится сообщение «Моя переменная называется «бар». печатается на экране.
Визуальный Бейсик
[ редактировать ]В Visual Basic и некоторых других языках функция под названием IIf
предоставляется, который можно использовать в качестве условного выражения. Однако оно не ведет себя как истинное условное выражение, поскольку всегда оцениваются как истинная, так и ложная ветви; просто результат одного из них выбрасывается, а результат другого возвращается функцией IIf.
Ткл
[ редактировать ]В ТКЛ if
— это не ключевое слово, а функция (в Tcl известная как команда или proc
). Например
if {$x > 10} {
puts "Foo!"
}
вызывает функцию с именем if
передача двух аргументов: первый — это условие, а второй — истинная ветвь. Оба аргумента передаются в виде строк (в Tcl все, что находится в фигурных скобках, является строкой).
В приведенном выше примере условие не оценивается перед вызовом функции. Вместо этого реализация if
Функция получает условие как строковое значение и отвечает за оценку этой строки как выражения в области вызывающего объекта. [7]
Такое поведение возможно при использовании uplevel
и expr
команды:
- Uplevel позволяет реализовать новые конструкции управления как процедуры Tcl (например, uplevel можно использовать для реализации конструкции while как процедуры Tcl). [8]
Потому что if
на самом деле это функция, она также возвращает значение:
- Возвращаемое значение команды — это результат выполнения сценария тела или пустая строка, если ни одно из выражений не было отличным от нуля и не было телаN. [9]
Ржавчина
[ редактировать ]В Русте , if
это всегда выражение. Он оценивается по значению какой бы ветки ни выполнялась, или по типу модуля. ()
если ни одна ветвь не выполняется. Если ветвь не предоставляет возвращаемое значение, она оценивается как ()
по умолчанию. Чтобы обеспечить if
тип выражения известен во время компиляции, каждая ветвь должна возвращать значение одного и того же типа. По этой причине else
ветвь фактически является обязательной, если только другие ветви не оцениваются как ()
, потому что if
без else
всегда можно оценить ()
по умолчанию. [10]
// Assign my_variable some value, depending on the value of x
let my_variable = if x > 20 {
1
} else {
2
};
// This variant will not compile because 1 and () have different types
let my_variable = if x > 20 {
1
};
// Values can be omitted when not needed
if x > 20 {
println!("x is greater than 20");
}
Защищенные условные предложения
[ редактировать ]Язык защищенных команд (GCL) Эдсгера Дейкстры поддерживает условное выполнение в виде списка команд, состоящего из логического ограничителя (соответствующего условию ) и соответствующего ему оператора. В GCL оценивается ровно одно из утверждений, защита которых истинна, а какая является произвольной. В этом коде
if G0 → S0 □ G1 → S1 ... □ Gn → Sn fi
Gi — это охранники, а Si — утверждения. Если ни одно из предупреждений не истинно, поведение программы не определено.
GCL предназначен в первую очередь для рассуждений о программах, но аналогичные обозначения были реализованы в Concurrent Pascal и occam .
Арифметика, если
[ редактировать ]До Fortran 77 в языке Fortran был арифметический оператор if , который переходит к одной из трех меток в зависимости от того, равен ли его аргумент e e < 0, e = 0, e > 0. Это был самый ранний условный оператор в Fortran. [11]
Синтаксис
[ редактировать ]IF (e) label1, label2, label3
Где e — любое числовое выражение (не обязательно целое число).
Семантика
[ редактировать ]Это эквивалентно этой последовательности, где e вычисляется только один раз.
IF (e .LT. 0) GOTO label1
IF (e .EQ. 0) GOTO label2
IF (e .GT. 0) GOTO label3
Стилистика
[ редактировать ]Арифметика if является неструктурированным управляющим оператором и не используется в структурном программировании .
На практике было замечено, что большинство арифметических операций IF
операторы ссылаются на следующий оператор с одной или двумя метками.
Это был единственный оператор условного управления в исходной реализации Фортрана на компьютере IBM 704 . На этом компьютере код операции тестирования и перехода имел три адреса для этих трех состояний. Другие компьютеры будут иметь регистры «флагов», такие как положительный, нулевой, отрицательный, четный, переполнение, перенос, связанные с последними арифметическими операциями, и будут использовать такие инструкции, как «Переход, если аккумулятор отрицательный», затем «Переход, если аккумулятор ноль» или аналогичные. Обратите внимание, что выражение вычисляется только один раз , и в таких случаях, как целочисленная арифметика, когда может произойти переполнение, также будут учитываться флаги переполнения или переноса.
Объектно-ориентированная реализация в Smalltalk
[ редактировать ]В отличие от других языков, в Smalltalk условный оператор не является языковой конструкцией , а определяется в классе Boolean
как абстрактный метод, принимающий два параметра, оба замыкания . Boolean
имеет два подкласса, True
и False
, которые оба определяют метод, True
выполнение только первого закрытия, False
выполнение только второго закрытия. [12]
var = condition
ifTrue: [ 'foo' ]
ifFalse: [ 'bar' ]
JavaScript
[ редактировать ]В JavaScript используются операторы if-else, аналогичные тем, которые используются в C. языках Логическое значение принимается в круглых скобках между зарезервированным ключевым словом if и левой фигурной скобкой.
if (Math.random() < 0.5) {
console.log("You got Heads!");
} else {
console.log("You got Tails!");
}
В приведенном выше примере используется условие Math.random() < 0.5
который выводит true
если случайное значение с плавающей запятой между 0 и 1 больше 0,5. Оператор использует его для случайного выбора между выводом You got Heads!
или You got Tails!
на консоль. Операторы else и else-if также могут быть соединены после фигурной скобки предыдущего оператора столько раз, сколько необходимо, как показано ниже:
var x = Math.random();
if (x < 1/3) {
console.log("One person won!");
} else if (x < 2/3) {
console.log("Two people won!");
} else {
console.log("It's a three-way tie!");
}
Лямбда-исчисление
[ редактировать ]В лямбда-исчислении концепция условия if-then-else может быть выражена с помощью следующих выражений:
true = λx. λy. x false = λx. λy. y ifThenElse = (λc. λx. λy. (c x y))
- true принимает до двух аргументов, и как только оба они предоставлены (см. каррирование ), он возвращает первый заданный аргумент.
- false принимает до двух аргументов, и как только оба они предоставлены (см. каррирование ), он возвращает второй заданный аргумент.
- ifThenElse принимает до трех аргументов, и как только все они предоставлены, он передает второй и третий аргумент первому аргументу (который представляет собой функцию, которая передает два аргумента и выдает результат). Мы ожидаем, что ifThenElse будет принимать в качестве аргумента только true или false, оба из которых проецируют данные два аргумента на предпочитаемый ими единственный аргумент, который затем возвращается.
примечание : если ifThenElse переданы две функции: левая и правая условные выражения; необходимо . также передать пустой кортеж () в результат ifThenElse, чтобы фактически вызвать выбранную функцию, в противном случае ifThenElse просто вернет объект функции без вызова
В системе, где числа могут использоваться без определения (например, Lisp, традиционная бумажная математика и т. д.), вышеизложенное можно выразить как одно замыкание ниже:
((λtrue. λfalse. λifThenElse.
(ifThenElse true 2 3)
)(λx. λy. x)(λx. λy. y)(λc. λl. λr. c l r))
Здесь true, false и ifThenElse привязаны к соответствующим определениям, которые передаются в их область действия в конце их блока.
Рабочая аналогия JavaScript (для строгости с использованием только функций с одной переменной) выглядит следующим образом:
var computationResult = ((_true => _false => _ifThenElse =>
_ifThenElse(_true)(2)(3)
)(x => y => x)(x => y => y)(c => x => y => c(x)(y)));
Приведенный выше код с функциями с несколькими переменными выглядит следующим образом:
var computationResult = ((_true, _false, _ifThenElse) =>
_ifThenElse(_true, 2, 3)
)((x, y) => x, (x, y) => y, (c, x, y) => c(x, y));
Другая версия предыдущего примера без системы, в которой предполагаются числа, приведена ниже.
В первом примере показано использование первой ветви, а во втором примере показано использование второй ветви.
((λtrue. λfalse. λifThenElse.
(ifThenElse true (λFirstBranch. FirstBranch) (λSecondBranch. SecondBranch))
)(λx. λy. x)(λx. λy. y)(λc. λl. λr. c l r))
((λtrue. λfalse. λifThenElse.
(ifThenElse false (λFirstBranch. FirstBranch) (λSecondBranch. SecondBranch))
)(λx. λy. x)(λx. λy. y)(λc. λl. λr. c l r))
Smalltalk использует аналогичную идею для своих представлений true и false, при этом True и False являются одноэлементными объектами, которые по-разному реагируют на сообщения ifTrue/ifFalse.
Раньше Haskell использовал именно эту модель для своего логического типа, но на момент написания большинство программ Haskell использовали синтаксическую сахарную конструкцию «if a then b else c», которая, в отличие от ifThenElse, не компонуется, если либо завернут в другую функцию, либо переопределен, как показано в разделе Haskell на этой странице.
Операторы Case и Switch
[ редактировать ]Операторы переключения (в некоторых языках операторы case или многосторонние ветки) сравнивают заданное значение с указанными константами и выполняют действия в соответствии с первой совпадающей константой. Обычно предусмотрено действие по умолчанию («иначе», «иначе»), которое должно быть выполнено, если совпадение не удалось. Операторы переключения могут обеспечивать оптимизацию компилятора , например таблицы поиска . В динамических языках регистры могут не ограничиваться постоянными выражениями и могут распространяться на сопоставление с образцом , как в примере сценария оболочки справа, где '*)' реализует регистр по умолчанию как регулярное выражение, соответствующее любой строке.
Паскаль : | С : | Шелл-скрипт : |
---|---|---|
case someChar of
'a': actionOnA;
'x': actionOnX;
'y','z':actionOnYandZ;
else actionOnNoMatch;
end;
|
switch (someChar) {
case 'a': actionOnA; break;
case 'x': actionOnX; break;
case 'y':
case 'z': actionOnYandZ; break;
default: actionOnNoMatch;
}
|
case $someChar in
a) actionOnA; ;;
x) actionOnX; ;;
[yz]) actionOnYandZ; ;;
*) actionOnNoMatch ;;
esac
|
Сопоставление с образцом
[ редактировать ]Сопоставление с образцом можно рассматривать как альтернативу операторам if-then-else и case . Он доступен на многих языках программирования с функциями функционального программирования, таких как Wolfram Language , ML и многих других. Вот простой пример, написанный на языке OCaml :
match fruit with
| "apple" -> cook pie
| "coconut" -> cook dango_mochi
| "banana" -> mix;;
Сила сопоставления шаблонов заключается в способности кратко сопоставлять не только действия, но и значения с шаблонами данных. Вот пример, написанный на Haskell , который иллюстрирует обе эти функции:
map _ [] = []
map f (h : t) = f h : map f t
функции Этот код определяет карту , которая применяет первый аргумент (функцию) к каждому из элементов второго аргумента (списка) и возвращает результирующий список. Две строки — это два определения функции для двух типов аргументов, возможных в этом случае: один, когда список пуст (просто возвращает пустой список), и другой случай, когда список не пуст.
Сопоставление с образцом, строго говоря, не всегда является конструкцией выбора, поскольку в Haskell можно написать только одну альтернативу, которая гарантированно всегда будет сопоставляться – в этой ситуации она используется не как конструкция выбора, а просто как способ для привязки имен к значениям. Однако он часто используется в качестве конструкции выбора на языках, на которых он доступен.
Условные выражения на основе хеша
[ редактировать ]В языках программирования, которые имеют ассоциативные массивы или сопоставимые структуры данных, таких как Python , Perl , PHP или Objective-C , идиоматично использовать их для реализации условного присваивания. [13]
pet = input("Enter the type of pet you want to name: ")
known_pets = {
"Dog": "Fido",
"Cat": "Meowsles",
"Bird": "Tweety",
}
my_name = known_pets[pet]
В языках, которые имеют анонимные функции или которые позволяют программисту присваивать именованную функцию ссылке на переменную, условный поток может быть реализован с использованием хеша в качестве таблицы диспетчеризации .
Предикация
[ редактировать ]Альтернативой инструкциям условного перехода является предикация . Предикация — это архитектурная особенность, которая позволяет выполнять инструкции в определенных условиях вместо изменения потока управления .
Перекрестная ссылка на систему выбора
[ редактировать ]Эта таблица относится к самой последней языковой спецификации каждого языка. Для языков, не имеющих спецификации, используется последняя официально выпущенная реализация.
Язык программирования | Структурировано, если | переключатель – выбор – регистр | Арифметика, если | Сопоставление с образцом [А] | ||
---|---|---|---|---|---|---|
затем | еще | иначе – если | ||||
Есть | Да | Да | Да | Да | Нет | Нет |
АПЛ | Нет | Да | Да | Да | Нет | Нет |
Баш-оболочка | Да | Да | Да | Да | Нет | Да |
С , С++ | Нет | Да | Ненужный [Б] [С] | Провал | Нет | Нет |
С# | Нет | Да | Ненужный [Б] [С] | Да | Нет | Нет |
КОБОЛ | Да | Да | Ненужный [С] | Да | Нет | Нет |
Эйфелева | Да | Да | Да | Да | Нет | Нет |
Ф# | Да | Да | Да | Ненужный [Д] | Нет | Да |
Фортран 90 | Да | Да | Да | Да | Да [Г] | Нет |
Идти | Нет | Да | Ненужный [С] | Да | Нет | Нет |
Хаскелл | Да | Нужный | Ненужный [С] | Да, но не нужно [Д] | Нет | Да |
Ява | Нет | Да | Ненужный [С] | Провал [14] | Нет | Нет |
ECMAScript ( JavaScript ) | Нет | Да | Ненужный [С] | Провал [15] | Нет | Нет |
Математика | Нет | Да | Да | Да | Нет | Да |
Оберон | Да | Да | Да | Да | Нет | Нет |
Перл | Нет | Да | Да | Да | Нет | Нет |
PHP | Нет | Да | Да | Провал | Нет | Нет |
Паскаль , Объектный Паскаль ( Делфи ) | Да | Да | Ненужный | Да | Нет | Нет |
Питон | Нет | Да | Да | Нет | Нет | Да |
QuickBASIC | Да | Да | Да | Да | Нет | Нет |
Руби | Да | Да | Да | Да | Нет | Да [ЧАС] |
Ржавчина | Нет | Да | Да | Ненужный | Нет | Да |
Скала | Нет | Да | Ненужный [С] | Провал [ нужна ссылка ] | Нет | Да |
SQL | Да [Ф] | Да | Да | Да [Ф] | Нет | Нет |
Быстрый | Нет | Да | Да | Да | Нет | Да |
Ткл | Нет | Да | Да | Да | Нет | Да |
Visual Basic , классический | Да | Да | Да | Да | Нет | Нет |
Визуальный Бейсик .NET | Да | Да | Да | Да | Нет | Нет |
Windows PowerShell | Нет | Да | Да | Провал | Нет | Нет |
- ^ Это относится к сопоставлению с образцом как к отдельной условной конструкции в языке программирования – в отличие от простой поддержки сопоставления строковых шаблонов, такой как поддержка регулярных выражений .
- 1 2 Директива #ELIF используется в подязыке препроцессора , который используется для изменения кода перед компиляцией; и включить другие файлы.
- 1 2 3 4 5 6 Часто встречающийся
else if
в семействе языков C, а также в COBOL и Haskell — это не функция языка, а набор вложенных и независимых операторов if then else в сочетании с определенной компоновкой исходного кода. Однако это также означает, что в этих языках отдельная конструкция else-if на самом деле не нужна. - 1 2 В Haskell и F# отдельная конструкция выбора констант не требуется, поскольку ту же задачу можно решить с помощью сопоставления с образцом.
- ^ В Рубине
case
Конструкция сопоставления регулярных выражений входит в число доступных альтернатив условного управления потоком. Пример см. в этом вопросе о переполнении стека. - 1 2 В SQL есть две похожие конструкции, выполняющие обе роли, обе они представлены в SQL-92 . «Обыскиваемый
CASE
" выражениеCASE WHEN cond1 THEN expr1 WHEN cond2 THEN expr2 [...] ELSE exprDflt END
работает какif ... else if ... else
, тогда как «простойCASE
" выражение:CASE expr WHEN val1 THEN expr1 [...] ELSE exprDflt END
работает как оператор переключения. Подробности и примеры см. в разделе Case (SQL) . - ^ Арифметика
if
устарел в Фортране 90. - ^ Сопоставление с образцом было добавлено в Ruby 3.0. [16] Некоторые конструкции сопоставления с образцом все еще являются экспериментальными.
См. также
[ редактировать ]- Отрасль (информатика)
- Условная компиляция
- Динамическая диспетчеризация для еще одного способа выбора выполнения
- Маккарти Формализм для истории и исторические ссылки
- Именованное условие
- Реляционный оператор
- Тест (Unix)
- Условия Йоды
- Условный ход
Ссылки
[ редактировать ]- ^ Синтаксис PHP elseif
- ^ Синтаксис Visual Basic ElseIf
- ^ Стандартный синтаксис оболочки POSIX
- ^ Язык Haskell 98 и библиотеки: пересмотренный отчет
- ^ « Предложение «если-то-иначе» на HaskellWiki »
- ^ «Эффективные советы по C №6. Не используйте тернарный оператор «Переполнение стека» . Embeddedgurus.com. 18 февраля 2009 г. Проверено 7 сентября 2012 г.
- ^ «Новые структуры управления» . Вики Тклера . Проверено 21 августа 2020 г.
- ^ "страница руководства более высокого уровня" . www.tcl.tk. Проверено 21 августа 2020 г.
- ^ «если страница руководства» . www.tcl.tk. Проверено 21 августа 2020 г.
- ^ «Если и если пусть выражения» . Проверено 1 ноября 2020 г.
- ^ «Американский национальный стандартный язык программирования FORTRAN» . 3 апреля 1978 г. Архивировано из оригинала 11 октября 2007 г. Проверено 9 сентября 2007 г.
- ^ «VisualWorks: Условная обработка» . 16 декабря 2006 г. Архивировано из оригинала 22 октября 2007 г. Проверено 9 сентября 2007 г.
- ^ «Pythonic способ реализации операторов switch/case» . Архивировано из оригинала 20 января 2015 г. Проверено 19 января 2015 г.
- ^ Java.sun.com , Спецификация языка Java, 3-е издание.
- ^ Ecma-international.org. Архивировано 12 апреля 2015 г. в спецификации языка ECMAScript Wayback Machine , 5-е издание.
- ^ «Сопоставление с образцом» . Документация для Ruby 3.0 .
Внешние ссылки
[ редактировать ]- СМИ, связанные с условным (компьютерным программированием) на Викискладе?
- ЕСЛИ НЕ (ActionScript 3.0) видео