~~~~~~~~~~~~~~~~~~~~ Arc.Ask3.Ru ~~~~~~~~~~~~~~~~~~~~~ 
Номер скриншота №:
✰ 88D60CE3F47BCBE8949B93477829E06E__1710259080 ✰
Заголовок документа оригинал.:
✰ Conditional (computer programming) - Wikipedia ✰
Заголовок документа перевод.:
✰ Условное (компьютерное программирование) — Википедия ✰
Снимок документа находящегося по адресу (URL):
✰ https://en.wikipedia.org/wiki/Conditional_(computer_programming) ✰
Адрес хранения снимка оригинал (URL):
✰ https://arc.ask3.ru/arc/aa/88/6e/88d60ce3f47bcbe8949b93477829e06e.html ✰
Адрес хранения снимка перевод (URL):
✰ https://arc.ask3.ru/arc/aa/88/6e/88d60ce3f47bcbe8949b93477829e06e__translat.html ✰
Дата и время сохранения документа:
✰ 16.06.2024 10:44:43 (GMT+3, MSK) ✰
Дата и время изменения документа (по данным источника):
✰ 12 March 2024, at 18:58 (UTC). ✰ 

~~~~~~~~~~~~~~~~~~~~~~ Ask3.Ru ~~~~~~~~~~~~~~~~~~~~~~ 
Сервисы Ask3.ru: 
 Архив документов (Снимки документов, в формате HTML, PDF, PNG - подписанные ЭЦП, доказывающие существование документа в момент подписи. Перевод сохраненных документов на русский язык.)https://arc.ask3.ruОтветы на вопросы (Сервис ответов на вопросы, в основном, научной направленности)https://ask3.ru/answer2questionТоварный сопоставитель (Сервис сравнения и выбора товаров) ✰✰
✰ https://ask3.ru/product2collationПартнерыhttps://comrades.ask3.ru


Совет. Чтобы искать на странице, нажмите Ctrl+F или ⌘-F (для MacOS) и введите запрос в поле поиска.
Arc.Ask3.ru: далее начало оригинального документа

Условное (компьютерное программирование) — Википедия Jump to content

Условное (компьютерное программирование)

Из Википедии, бесплатной энциклопедии
Блок-схема «если-то-иначе»
Вложенная if-then-else блок-схема

В информатике условные выражения (то есть условные операторы , условные выражения и условные конструкции ) — это команды языка программирования для обработки решений. , определенное программистом: В частности, условные выражения выполняют различные вычисления или действия в зависимости от того, какое значение имеет логическое условие истинное или ложное. С точки зрения потока управления , решение всегда достигается путем выборочного изменения потока управления на основе некоторого условия (кроме случая предсказания ветвления ). Хотя динамическая диспетчеризация обычно не классифицируется как условная конструкция, это еще один способ выбора между альтернативами во время выполнения . Условные операторы — это контрольные точки в программе, определяющие поведение в зависимости от ситуации.

Терминология [ править ]

В императивных языках программирования термин «условное выражение обычно используется », тогда как в функциональном программировании термины «условное выражение предпочтительны » или «условная конструкция», поскольку все эти термины имеют разные значения.

Если-то(-иначе) [ править ]

The if–then конструкция (иногда называемая if–then–else) распространен во многих языках программирования. Хотя синтаксис варьируется от языка к языку, базовая структура (в форме псевдокода ) выглядит следующим образом:

Если  (логическое условие)  Тогда 
     (последующий) 
  Еще 
     (альтернатива) 
  Конец, если 

Например:

Если  запас=0  Тогда 
     сообщение = заказать новый товар 
  Еще 
     сообщение= есть в наличии 
  Конец, если 

В приведенном выше примере кода часть, представленная (логическим условием) , представляет собой условное выражение , имеющее внутреннее значение (например, оно может быть заменено любым из значений 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 оператор в гнезде после анализа.

если  а  , то   если  б  , то  s  еще  s2
 

можно проанализировать как

если  а  , то  (  если  б  , то  s)  иначе  s2
 

или

если  а  , то  (  если  б  , то  s  , иначе  s2)
 

в зависимости от того, else связано с первым if или второй if. Это известно как проблема висячего else и решается различными способами, в зависимости от языка (обычно через end if заявление или {...} кронштейны).

Иначе, если [ править ]

Используя else if, можно объединить несколько условий. Будут выполняться только операторы, следующие за первым условием, которое окажется истинным. Все остальные операторы будут пропущены.

if  условие  then 
    -- операторы 
 elseif  условие  then 
    -- дополнительные операторы 
 elseif  условие  then 
    -- дополнительные операторы; 
  ... 
  else 
    -- другие утверждения; 
  конец, если  ; 
 

Например, для магазина, предлагающего скидку до 30% на товар:

если  скидка < 11%  , то 
     распечатать (нужно заплатить 30$) 
  иначе, если  скидка<21%  , тогда 
     распечатать (нужно заплатить 20 долларов) 
  иначе, если  скидка<31%  , тогда 
     распечатать (нужно заплатить 10 долларов) 
  конец, если  ; 
 

В приведенном выше примере, если скидка составляет 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 как выражение:

 моя переменная:= если x > 20, то 1, иначе 2
 

Диалекты Лиспа [ править ]

В диалектах Лиспа   Scheme , Racket и Common Lisp   — первый из которых в значительной степени был вдохновлен АЛГОЛом:

;;   Схема 
 (  определить   мою переменную   (  если   (  >   x   12  )   1   2  ))     ;   Присваивает «myvariable» значение 1 или 2, в зависимости от значения «x». 
;;   Common Lisp 
 (  let   ((  x   10  )) 
   (  setq   myvariable   (  if   (  >   x   12  )   2   4  )))    ;   Присваивает 'myvariable' значение 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-подобных языках:

моя_переменная   =   х   >   10   ?    "фу"   :   "бар"  ;     // В C-подобных языках 

if-then-else семейства Алголя которые можно сравнить с выражениями (в отличие от оператора ) (и похожими, среди прочего, в Ruby и Scala).

Чтобы добиться того же с помощью оператора if, потребуется более одной строки кода (в соответствии с типичными соглашениями о макете) и дважды упомянуть «my_variable»:

если   (  x   >   10  ) 
     my_variable   =   "foo"  ; 
  иначе 
     my_variable   =   "бар"  ; 

Некоторые утверждают, что явный оператор if/then легче читать и что он может скомпилироваться в более эффективный код, чем тернарный оператор. [6] в то время как другие утверждают, что краткие выражения легче читать, чем утверждения, разбитые на несколько строк и содержащие повторения.

Маленький базовый [ править ]

х   =   ТекстовоеОкно  .   ReadNumber  () 
 Если   (  x   >   10  )   Тогда 
     TextWindow  .   WriteLine  (  "Моя переменная называется 'foo'."  ) 
 Else 
     TextWindow  .   WriteLine  (  "Моя переменная называется 'bar'."  ) 
 EndIf 

Во-первых, когда пользователь запускает программу, появляется курсор, ожидающий, пока читатель наберет число. Если это число больше 10, появится текст «Моя переменная называется 'foo'». отображается на экране. Если число меньше 10, появится сообщение «Моя переменная называется «бар». печатается на экране.

Visual Basic [ править ]

В Visual Basic и некоторых других языках функция под названием IIfпредоставляется, который можно использовать в качестве условного выражения. Однако оно не ведет себя как истинное условное выражение, поскольку всегда оцениваются как истинная, так и ложная ветви; просто результат одного из них выбрасывается, а результат другого возвращается функцией IIf.

ТКЛ [ править ]

В ТКЛ if — это не ключевое слово, а функция (в Tcl известная как команда или proc). Например

if   {  $x   >   10  }   { 
    ставит   "Фу!" 
  } 

вызывает функцию с именем ifпередача двух аргументов: первый — это условие, а второй — истинная ветвь. Оба аргумента передаются в виде строк (в Tcl все, что находится в фигурных скобках, является строкой).

В приведенном выше примере условие не оценивается перед вызовом функции. Вместо этого реализация if Функция получает условие как строковое значение и отвечает за оценку этой строки как выражения в области вызывающего объекта. [7]

Такое поведение возможно при использовании uplevel и expr команды:

Uplevel позволяет реализовать новые конструкции управления как процедуры Tcl (например, uplevel можно использовать для реализации конструкции while как процедуры Tcl). [8]

Потому что if на самом деле это функция, она также возвращает значение:

Возвращаемое значение команды — это результат выполнения сценария тела или пустая строка, если ни одно из выражений не было отличным от нуля и не было телаN. [9]

Ржавчина [ править ]

В Русте , ifэто всегда выражение. Он оценивается по значению какой бы ветки ни выполнялась, или по типу модуля. ()если ни одна ветвь не выполняется. Если ветвь не предоставляет возвращаемое значение, она оценивается как ()по умолчанию. Чтобы обеспечить ifтип выражения известен во время компиляции, каждая ветвь должна возвращать значение одного и того же типа. По этой причине else ветвь фактически является обязательной, если только другие ветви не оцениваются как (), потому что if без else всегда можно оценить () по умолчанию. [10]

// Присваиваем my_variable какое-то значение в зависимости от значения x 
 let   my_variable   =   if   x   >   20   { 
     1 
 }   else   { 
     2 
 }; 

  // Этот вариант не скомпилируется, поскольку 1 и () имеют разные типы 
 let   my_variable   =   if   x   >   20   { 
     1 
 }; 

  // Значения можно опускать, если они не нужны, 
 если   x   >   20   { 
     println!   (  «x больше 20»  ); 
  } 

Арифметика если [ править ]

До Фортрана 77 в языке Фортран есть оператор «арифметического if», который находится на полпути между вычисляемым IF и оператором case, основанным на трихотомии x < 0, x = 0, x > 0. Это был самый ранний условный оператор в Фортран: [11]

ЕСЛИ   (  e  )   метка1  ,   метка2  ,   метка3 

Где e — любое числовое выражение (не обязательно целое число); это эквивалентно

ЕСЛИ   (  e   .  LT  .   0  )   ПЕРЕЙТИ К   метке 1 
 ЕСЛИ   (  e   .  EQ  .   0  )   ПЕРЕЙТИ К   метке 2 
 ПЕРЕЙТИ К   метке 3 

Поскольку эта арифметика ЕСЛИ эквивалентна множеству GOTOоператоры, которые могут перейти куда угодно, он считается неструктурированным оператором управления и не должен использоваться, если можно использовать более структурированные операторы. На практике было замечено, что большинство арифметических операций IF операторы ссылались на следующий оператор с одной или двумя метками.

Это был единственный оператор условного управления в исходной реализации Фортрана на компьютере IBM 704 . На этом компьютере код операции тестирования и перехода имел три адреса для этих трех состояний. Другие компьютеры будут иметь регистры «флагов», такие как положительный, нулевой, отрицательный, четный, переполнение, перенос, связанные с последними арифметическими операциями, и будут использовать такие инструкции, как «Переход, если аккумулятор отрицательный», затем «Переход, если аккумулятор ноль» или аналогичные. Обратите внимание, что выражение вычисляется только один раз , и в таких случаях, как целочисленная арифметика, когда может произойти переполнение, также будут учитываться флаги переполнения или переноса.

Объектно-ориентированная реализация в Smalltalk [ править ]

В отличие от других языков, в Smalltalk условный оператор не является языковой конструкцией , а определяется в классе Boolean как абстрактный метод, принимающий два параметра, оба замыкания . Boolean имеет два подкласса, True и False, которые оба определяют метод, True выполнение только первого закрытия, False выполнение только второго закрытия. [12]

var   =   условие  
     ifTrue:  [  'foo'  ] 
      ifFalse:  [  'бар'  ] 
 

JavaScript [ править ]

В JavaScript используются операторы if-else, аналогичные тем, которые используются в C. языках Логическое значение принимается в круглых скобках между зарезервированным ключевым словом if и левой фигурной скобкой.

если   (  Math.random  0,5  )   <   )  (   { 
   console  .   log  (  "У вас есть головы!"  ); 
  }   Еще   { 
   консоль  .   log  (  "У тебя Тейлс!"  ); 
  } 

В приведенном выше примере используется условие Math.random() < 0.5 который выводит trueесли случайное значение с плавающей запятой между 0 и 1 больше 0,5. Оператор использует его для случайного выбора между выводом You got Heads! или You got Tails!на консоль. Операторы else и else-if также могут быть соединены после фигурной скобки предыдущего оператора столько раз, сколько необходимо, как показано ниже:

вар   х   =   Математика  .   случайный  (); 
  если   (  Икс   <   1  ​​/  3  )   { 
   консоль  .   log  (  "Выиграл один человек!"  ); 
  }   Еще   если   (  х   <   2/3  )   { 
   console  .   log  (  "Выиграли два человека!"  ); 
  }   Еще   { 
   консоль  .   log  (  "Это тройная ничья!"  ); 
  } 

Лямбда-исчисление [ править ]

В лямбда-исчислении концепция условия if-then-else может быть выражена с помощью следующих выражений:

истина = λx.  λy.  Икс
 ложь = λx.  λy.  й
 ifThenElse = (λc. λx. λy. (cxy))
 
  1. true принимает до двух аргументов, и как только оба они предоставлены (см. каррирование ), он возвращает первый заданный аргумент.
  2. false принимает до двух аргументов, и как только оба они предоставлены (см. каррирование ), он возвращает второй заданный аргумент.
  3. 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   ComputingResult   =   ((  _true   =>   _false   =>   _ifThenElse   =>  
      _ifThenElse  (  _true  )(  2  )(  3  )  
  )(  x   =>   y   =>   x  )(  x   =>   y   =>   y  )(  c   =>   x   =>   y   =>   c  (  x  )(  y  ))); 

Приведенный выше код с функциями с несколькими переменными выглядит следующим образом:

 var   вычислениеResult   =   ((  _true  ,   _false  ,   _ifThenElse  )   => 
      _ifThenElse  (  _true  ,   2  ,   3  ) 
  )((  x  ,   y  )   =>   x  ,   (  x  ,   y  )   =>   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 или многосторонние ветки) сравнивают заданное значение с указанными константами и выполняют действия в соответствии с первой совпадающей константой. Обычно предусмотрено действие по умолчанию («иначе», «иначе»), которое должно быть выполнено, если совпадение не удалось. Операторы переключения могут обеспечивать оптимизацию компилятора , например таблицы поиска . В динамических языках регистры могут не ограничиваться постоянными выражениями и могут распространяться на сопоставление с образцом , как в примере сценария оболочки справа, где '*)' реализует регистр по умолчанию как регулярное выражение, соответствующее любой строке.

Паскаль : С : Шелл-скрипт :
случай   someChar   of 
   'a'  :   actionOnA  ; 
    'х'  :   действиеOnX  ; 
    'y'  ,  'z'  :  actionOnYandZ  ; 
    еще   действиеOnNoMatch  ; 
  конец  ; 
переключатель   (  someChar  )   { 
   case   'a'  :   actionOnA  ;    перерыв  ; 
    случай   'x'  :   actionOnX  ;    перерыв  ; 
    случай   'y'  : 
   случай   'z'  :   actionOnYandZ  ;    перерыв  ; 
    по умолчанию  :   actionOnNoMatch  ; 
  } 
случай   $someChar   в  
    a  )      actionOnA  ;    ;; 
     х  )      действиеOnX  ;    ;; 
     [  yz  ])   actionOnYandZ  ;    ;; 
    *  )       actionOnNoMatch    ;; 
  Эсак 

Сопоставление с образцом [ править ]

Сопоставление с образцом можно рассматривать как альтернативу операторам if-then-else и case . Он доступен на многих языках программирования с функциями функционального программирования, таких как Wolfram Language , ML и многих других. Вот простой пример, написанный на языке OCaml :

сочетать   фрукты   с 
 |    "яблоко"   ->   приготовить   пирог 
 |    "кокос"   ->   приготовить   данго_моти 
 |    "банан"   ->   микс  ;; 

Сила сопоставления шаблонов заключается в способности кратко сопоставлять не только действия, но и значения с шаблонами данных. Вот пример, написанный на Haskell , который иллюстрирует обе эти функции:

карта   _   []        =   [] 
 карта   ж   (  час   :   т  )   знак   равно ж   час   :   карта   ж   т 

функции Этот код определяет карту , которая применяет первый аргумент (функцию) к каждому из элементов второго аргумента (списка) и возвращает результирующий список. Две строки — это два определения функции для двух типов аргументов, возможных в этом случае: один, когда список пуст (просто возвращает пустой список), и другой случай, когда список не пуст.

Сопоставление с образцом, строго говоря, не всегда является конструкцией выбора, поскольку в Haskell можно написать только одну альтернативу, которая гарантированно всегда будет сопоставляться – в этой ситуации она используется не как конструкция выбора, а просто как способ для привязки имен к значениям. Однако он часто используется в качестве конструкции выбора на языках, на которых он доступен.

Условные выражения на основе хэша [ править ]

В языках программирования, которые имеют ассоциативные массивы или сопоставимые структуры данных, таких как Python , Perl , PHP или Objective-C , идиоматично использовать их для реализации условного присваивания. [13]

pet   =   input  (  «Введите тип питомца, которого вы хотите назвать:»  ) 
 known_pets   =   { 
     «Собака»  :   «Фидо»  , 
     «Кошка»  :   «Мяуслз»  , 
     «Птица»  :   «Твити»  , 
 } 
 my_name   =   известные_питомцы  [  домашнее животное  ] 

В языках, которые имеют анонимные функции или которые позволяют программисту присваивать именованную функцию ссылке на переменную, условный поток может быть реализован с использованием хеша в качестве таблицы диспетчеризации .

Предикация [ править ]

Альтернативой инструкциям условного перехода является предикация . Предикация — это архитектурная особенность, которая позволяет выполнять инструкции в определенных условиях вместо изменения потока управления .

Перекрестная ссылка на систему выбора [ править ]

Эта таблица относится к самой последней языковой спецификации каждого языка. Для языков, не имеющих спецификации, используется последняя официально выпущенная реализация.

Язык программирования Структурировано, если переключатель – выбор – регистр Арифметика, если Сопоставление с образцом [А]
затем еще иначе – если
Есть Да Да Да Да Нет Нет
АПЛ Нет Да Да Да Нет Нет
Баш-оболочка Да Да Да Да Нет Да
С , С++ Нет Да Ненужный [Б] [С] Проваливаться Нет Нет
С# Нет Да Ненужный [Б] [С] Да Нет Нет
КОБОЛ Да Да Ненужный [С] Да Нет Нет
Эйфелева Да Да Да Да Нет Нет
Ф# Да Да Да Ненужный [Д] Нет Да
Фортран 90 Да Да Да Да Да [Г] Нет
Идти Нет Да Ненужный [С] Да Нет Нет
Хаскелл Да Нужный Ненужный [С] Да, но не нужно [Д] Нет Да
Джава Нет Да Ненужный [С] Проваливаться [14] Нет Нет
ECMAScript ( JavaScript ) Нет Да Ненужный [С] Проваливаться [15] Нет Нет
Математика Нет Да Да Да Нет Да
Оберон Да Да Да Да Нет Нет
Перл Нет Да Да Да Нет Нет
PHP Нет Да Да Проваливаться Нет Нет
Паскаль , Объектный Паскаль ( Делфи ) Да Да Ненужный Да Нет Нет
Питон Нет Да Да Нет Нет Да
QuickBASIC Да Да Да Да Нет Нет
Рубин Да Да Да Да Нет Да [ЧАС]
Ржавчина Нет Да Да Ненужный Нет Да
Скала Нет Да Ненужный [С] Проваливаться [ нужна цитата ] Нет Да
SQL Да [Ф] Да Да Да [Ф] Нет Нет
Быстрый Нет Да Да Да Нет Да
Ткл Нет Да Да Да Нет Да
Visual Basic , классический Да Да Да Да Нет Нет
Визуальный Бейсик .NET Да Да Да Да Нет Нет
Windows PowerShell Нет Да Да Проваливаться Нет Нет
  1. ^ Это относится к сопоставлению с образцом как к отдельной условной конструкции в языке программирования – в отличие от простой поддержки сопоставления строковых шаблонов, такой как регулярных выражений . поддержка
  2. 1 2 Директива #ELIF используется в подязыке препроцессора , который используется для изменения кода перед компиляцией; и включить другие файлы.
  3. 1 2 3 4 5 6 Часто встречающийся else ifв семействе языков C, а также в COBOL и Haskell — это не особенность языка, а набор вложенных и независимых операторов if then else в сочетании с определенной компоновкой исходного кода. Однако это также означает, что отдельная конструкция else-if в этих языках на самом деле не нужна.
  4. 1 2 В Haskell и F# отдельная конструкция выбора констант не требуется, поскольку ту же задачу можно решить с помощью сопоставления с образцом.
  5. ^ В Рубине caseконструкции, сопоставление регулярных выражений входит в число доступных альтернатив условного управления потоком. Пример см. в этом вопросе о переполнении стека.
  6. 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) .
  7. ^ Арифметика if устарел в Фортране 90.
  8. ^ Сопоставление с образцом было добавлено в Ruby 3.0. [16] Некоторые конструкции сопоставления с образцом все еще являются экспериментальными.

См. также [ править ]

Ссылки [ править ]

  1. ^ Синтаксис PHP elseif
  2. ^ Синтаксис Visual Basic ElseIf
  3. ^ Стандартный синтаксис оболочки POSIX
  4. ^ Язык Haskell 98 и библиотеки: пересмотренный отчет
  5. ^ « Предложение «если-то-иначе» на HaskellWiki »
  6. ^ «Эффективные советы по C №6. Не используйте тернарный оператор «Переполнение стека» . Embeddedgurus.com. 18 февраля 2009 г. Проверено 7 сентября 2012 г.
  7. ^ «Новые структуры управления» . Вики Тклера . Проверено 21 августа 2020 г.
  8. ^ "страница руководства более высокого уровня" . www.tcl.tk. ​ Проверено 21 августа 2020 г.
  9. ^ «если страница руководства» . www.tcl.tk. ​ Проверено 21 августа 2020 г.
  10. ^ «Если и если пусть выражения» . Проверено 1 ноября 2020 г.
  11. ^ «Американский национальный стандартный язык программирования FORTRAN» . 3 апреля 1978 г. Архивировано из оригинала 11 октября 2007 г. Проверено 9 сентября 2007 г.
  12. ^ «VisualWorks: Условная обработка» . 16 декабря 2006 г. Архивировано из оригинала 22 октября 2007 г. Проверено 9 сентября 2007 г.
  13. ^ «Pythonic способ реализации операторов switch/case» . Архивировано из оригинала 20 января 2015 г. Проверено 19 января 2015 г.
  14. ^ Java.sun.com , Спецификация языка Java, 3-е издание.
  15. ^ Ecma-international.org. Архивировано 12 апреля 2015 г. в спецификации языка ECMAScript Wayback Machine , 5-е издание.
  16. ^ «Сопоставление с образцом» . Документация для Ruby 3.0 .

Внешние ссылки [ править ]

Arc.Ask3.Ru: конец оригинального документа.
Arc.Ask3.Ru
Номер скриншота №: 88D60CE3F47BCBE8949B93477829E06E__1710259080
URL1:https://en.wikipedia.org/wiki/Conditional_(computer_programming)
Заголовок, (Title) документа по адресу, URL1:
Conditional (computer programming) - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть, любые претензии не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, денежную единицу можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)