Warunkowe (programowanie komputerowe) - Conditional (computer programming)

Schemat przepływu If-Then-Else
Zagnieżdżony schemat blokowy „Jeśli – wtedy – inaczej”

W informatyce , warunkowych (czyli instrukcji warunkowych , wyrażeń warunkowych i konstrukcji warunkowych ,) są język programowania poleceń do obsługi decyzje. W szczególności warunki warunkowe wykonują różne obliczenia lub akcje w zależności od tego, czy warunek logiczny zdefiniowany przez programistę ma wartość prawda, czy fałsz. Jeśli chodzi o przepływ sterowania , decyzja jest zawsze podejmowana przez selektywną zmianę strumienia sterowania na podstawie pewnego warunku (poza przypadkiem predykacji rozgałęzienia ).

Chociaż dynamiczne wysyłanie nie jest zwykle klasyfikowane jako konstrukcja warunkowa, jest to inny sposób wyboru między alternatywami w czasie wykonywania .

Terminologia

W imperatywnych językach programowania zwykle używa się terminu „ instrukcja warunkowa ”, podczas gdy w programowaniu funkcjonalnym preferowane są terminy „ wyrażenie warunkowe ” lub „konstrukcja warunkowa”, ponieważ wszystkie te terminy mają różne znaczenia.

Jeśli-to(-inaczej)

if–thenKonstrukt (czasami nazywany if–then–else) jest powszechne w wielu językach programowania. Chociaż składnia różni się w zależności od języka, podstawowa struktura (w postaci pseudokodu ) wygląda tak:

If (boolean condition) Then
    (consequent)
Else
    (alternative)
End If

Na przykład:

If stock=0 Then
    message= order new stock
Else
    message= there is stock
End If

W powyższym kodzie przykładowym część reprezentowana przez (warunek logiczny) stanowi wyrażenie warunkowe , mające wewnętrzną wartość (np. można ją zastąpić dowolną z wartości Truelub False), ale nie mające wewnętrznego znaczenia. W przeciwieństwie do tego, połączenie tego wyrażenia, Ifi Thenotaczającego je oraz następnika, który następuje później, tworzy zdanie warunkowe , mające samoistne znaczenie (np. wyrażające spójną regułę logiczną), ale nie mające żadnej samoistnej wartości.

Kiedy interpreter znajdzie If, oczekuje warunku logicznego – na przykład , x > 0co oznacza, że ​​„zmienna x zawiera liczbę większą od zera” – i ocenia ten warunek. Jeśli warunkiem jest true, thenwykonywane są następujące instrukcje . W przeciwnym razie wykonanie jest kontynuowane w kolejnej gałęzi – albo w else bloku (co zwykle jest opcjonalne), albo jeśli nie ma elsegałęzi, to po end If.

Po wykonaniu którejkolwiek gałęzi, sterowanie powraca do punktu po end If.

Historia i rozwój

We wczesnych językach programowania, zwłaszcza w niektórych dialektach języka BASIC w komputerach domowych z lat 80. , if–theninstrukcja mogła zawierać tylko GOTOinstrukcje (odpowiednik instrukcji gałęzi ). Doprowadziło to do trudnego do odczytania stylu programowania znanego jako programowanie spaghetti , z programami w tym stylu zwanym kodem spaghetti . W rezultacie, programowanie strukturalne , które pozwala na umieszczanie (praktycznie) dowolnych instrukcji w blokach instrukcji wewnątrz ifinstrukcji, zyskało na popularności, aż stało się normą nawet w większości kręgów programowania BASIC. Takie mechanizmy i zasady były oparte na starszych, ale bardziej zaawansowanej Algol rodziny języków i ALGOL podobny języków takich jak Pascal i Modula-2 pod wpływem nowoczesnych BASIC warianty od wielu lat. Chociaż możliwe jest używanie tylko GOTOinstrukcji w if–theninstrukcjach do pisania programów, które nie są kodem spaghetti i są równie dobrze zorganizowane i czytelne, jak programy napisane w strukturalnym języku programowania, programowanie strukturalne ułatwia to i wymusza to. if–then–elseInstrukcje strukturalne , takie jak powyższy przykład, są jednym z kluczowych elementów programowania strukturalnego i są obecne w większości popularnych języków programowania wysokiego poziomu, takich jak C , Java , JavaScript i Visual Basic .

Problem „wisiącego innego”

Słowo elsekluczowe jest skierowane na konkretną if–theninstrukcję, która je poprzedza, ale w przypadku instrukcji zagnieżdżonych if–then klasyczne języki programowania, takie jak ALGOL 60, miały trudności z określeniem, na którą konkretną instrukcję należy kierować. Bez wyraźnych granic, dla której instrukcja jest którą, elsesłowo kluczowe może wskazywać na dowolną poprzednią if–theninstrukcję w gnieździe, zgodnie z analizą.

if a then if b then s else s2

można przeanalizować jako

if a then (if b then s) else s2

lub

if a then (if b then s else s2)

w zależności od tego, czy elsejest skojarzony z pierwszym ifczy drugim if. Jest to znane jako problem zwisającego else i jest rozwiązywany na różne sposoby, w zależności od języka (zwykle za pomocą end ifinstrukcji lub {...}nawiasów).

Inaczej, jeśli

Używając else if, można połączyć kilka warunków. Tylko instrukcje następujące po pierwszym warunku, który zostanie uznany za spełniony, zostaną wykonane. Wszystkie inne stwierdzenia zostaną pominięte.

if condition then
   --statements
elseif condition then
    -- more statements
elseif condition then
    -- more statements;
...
else
    -- other statements;
end if;

Na przykład dla sklepu oferującego aż 30% rabatu na towar:

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;

Wyrażenie elseif, na przykład w języku Ada , jest po prostu cukrem składniowym for elsea następnie if. W Adzie różnica polega na tym, że end ifpotrzebny jest tylko jeden , jeśli używa się elseifzamiast elsenastępującego po nim if. PHP używa elseifsłowa kluczowego zarówno w nawiasach klamrowych, jak i składni dwukropka. Perl dostarcza słowo kluczowe, elsifaby uniknąć dużej liczby nawiasów, które byłyby wymagane przez instrukcje multiple ifi else. Python używa słowa kluczowego special, elifponieważ struktura jest oznaczana przez wcięcie, a nie nawiasy klamrowe, więc wielokrotne użycie elsei ifwymagałoby zwiększonego wcięcia po każdym warunku. Niektóre implementacje BASIC , takie jak Visual Basic , ElseIfrównież używają . Podobnie, wcześniejsze powłoki UNIX (później zebrane do składni powłoki POSIX) również używają elif, ale dają możliwość rozgraniczenia za pomocą spacji, łamania linii lub obu.

Jednak w wielu językach bardziej bezpośrednio wywodzących się od Algola, takich jak Simula , Pascal , BCPL i C , ta specjalna składnia else ifkonstruktu nie występuje, ani nie występuje w wielu syntaktycznych pochodnych języka C, takich jak Java , ECMAScript i wkrótce. Działa to, ponieważ w tych językach każda pojedyncza instrukcja (w tym przypadku ...) może następować po warunkowym bez zamykania w bloku. if cond

Ten wybór projektu ma niewielki „koszt”. Każda else ifgałąź skutecznie dodaje dodatkowy poziom zagnieżdżenia. To komplikuje pracę kompilatorowi (lub osobom, które go piszą), ponieważ kompilator musi analizować i implementować else ifrekurencyjnie dowolnie długie łańcuchy.

Jeśli wszystkie warunki w sekwencji warunków warunkowych testują wartość pojedynczego wyrażenia (np. if x=0... else if x=1... else if x=2...), alternatywą jest instrukcja switch , zwana również instrukcją case lub instrukcją select. I odwrotnie, w językach, które nie mają instrukcji switch, mogą one być tworzone przez sekwencję else ifinstrukcji.

Wyrażenia „jeżeli-to-inne”

Wiele języków obsługuje wyrażenia if , które są podobne do instrukcji if, ale jako wynik zwracają wartość. Są to zatem wyrażenia prawdziwe (które dają w wyniku wartość), a nie oświadczenia (które mogą nie być dozwolone w kontekście wartości).

Rodzina Algoli

ALGOL 60 i niektórzy inni członkowie rodziny ALGOL pozwalają if–then–elsejako wyrażenie:

  myvariable := if x > 20 then 1 else 2

Dialekty lispowe

W dialektach Lisp Scheme , Racket i Common Lisp  – z których pierwszy był w dużej mierze zainspirowany przez ALGOL:

;; 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

W Haskell 98 istnieje tylko wyrażenie if , no if statement , a elseczęść jest obowiązkowa, ponieważ każde wyrażenie musi mieć jakąś wartość. Logika, która byłaby wyrażana za pomocą warunków warunkowych w innych językach, jest zwykle wyrażana za pomocą dopasowania wzorców w funkcjach rekurencyjnych.

Ponieważ Haskell jest leniwy , możliwe jest pisanie struktur kontrolnych, takich jak if , jako zwykłych wyrażeń; leniwa ocena oznacza, że funkcja if może ocenić tylko warunek i właściwą gałąź (gdzie ścisły język oceniłby wszystkie trzy). Można to napisać tak:

if' :: Bool -> a -> a -> a
if' True x _ = x
if' False _ y = y

Języki podobne do C

Języki C i C-podobne mają specjalny operator trójargumentowy ( ?: ) dla wyrażeń warunkowych z funkcją, która może być opisana przez szablon taki jak ten:

condition ? evaluated-when-true : evaluated-when-false

Oznacza to, że może być wbudowany w wyrażenia, w przeciwieństwie do instrukcji if, w językach podobnych do C:

my_variable = x > 10 ? "foo" : "bar";  // In C-like languages

które można porównać do wyrażeń z rodziny Algol if-then-else (w przeciwieństwie do stwierdzenia ) (i podobnych m.in. w Ruby i Scali).

Aby osiągnąć to samo za pomocą instrukcji if, zajęłoby to więcej niż jeden wiersz kodu (w typowych konwencjach układu) i wymagałoby dwukrotnego wzmianki „moja_zmienna”:

if (x > 10)
    my_variable = "foo";
else
    my_variable = "bar";

Niektórzy twierdzą, że wyraźna instrukcja if/then jest łatwiejsza do odczytania i może zostać skompilowana do bardziej wydajnego kodu niż operator trójargumentowy, podczas gdy inni twierdzą, że zwięzłe wyrażenia są łatwiejsze do odczytania niż instrukcje rozłożone na kilka wierszy zawierających powtórzenia.

Mały podstawowy

x = TextWindow.ReadNumber()
If (x > 10) Then
    TextWindow.WriteLine("My variable is named 'foo'.")
Else
    TextWindow.WriteLine("My variable is named 'bar'.")
EndIf

Po pierwsze, gdy użytkownik uruchamia program, pojawia się kursor oczekujący na wpisanie przez czytnik liczby. Jeśli ta liczba jest większa niż 10, tekst „Moja zmienna ma nazwę 'foo'”. jest wyświetlany na ekranie. Jeśli liczba jest mniejsza niż 10, pojawi się komunikat „Moja zmienna ma nazwę 'bar'”. jest drukowany na ekranie.

Visual Basic

W Visual Basic i niektórych innych językach dostępna jest wywoływana funkcja IIf, która może być używana jako wyrażenie warunkowe. Jednak nie zachowuje się jak prawdziwe wyrażenie warunkowe, ponieważ zarówno gałęzie prawda, jak i fałsz są zawsze oceniane; po prostu wynik jednego z nich jest odrzucany, a wynik drugiego zwraca funkcja IIf.

Tcl

W Tcl if nie jest słowem kluczowym, ale funkcją (w Tcl znane jako polecenie lub proc). Na przykład

if {$x > 10} {
   puts "Foo!"
}

wywołuje funkcję o nazwie ifprzekazywanie 2 argumentów: pierwszy to warunek, a drugi to prawdziwa gałąź. Oba argumenty są przekazywane jako łańcuchy (w Tcl wszystko w nawiasach klamrowych jest łańcuchem).

W powyższym przykładzie warunek nie jest oceniany przed wywołaniem funkcji. Zamiast tego implementacja iffunkcji odbiera warunek jako wartość ciągu i jest odpowiedzialna za ocenę tego ciągu jako wyrażenia w zakresie wywołującym.

Takie zachowanie jest możliwe za pomocą poleceń upleveli expr:

Uplevel umożliwia implementację nowych konstrukcji kontrolnych jako procedur Tcl (na przykład uplevel może być użyty do zaimplementowania konstrukcji while jako procedury Tcl).

Ponieważ w ifrzeczywistości jest funkcją, zwraca również wartość:

Wartość zwracana z polecenia jest wynikiem wykonanego skryptu treści lub pustym ciągiem, jeśli żadne z wyrażeń nie było niezerowe i nie było bodyN.

Rdza

W Rust , ifjest zawsze wyrazem. Ocenia się na wartość dowolnej gałęzi, która jest wykonywana, lub na typ jednostki, ()jeśli żadna gałąź nie jest wykonywana. Jeśli gałąź nie dostarcza wartości zwracanej, ()domyślnie przyjmuje wartość. Aby upewnić się, ifże typ wyrażenia jest znany w czasie kompilacji, każda gałąź musi oszacować wartość tego samego typu. Z tego powodu elsegałąź jest faktycznie obowiązkowa, chyba że inne gałęzie oceniają jako (), ponieważ ifbez elsemoże zawsze ()domyślnie oceniać jako.

// 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");
}

Arytmetyka, jeśli

Aż do Fortran 77 język Fortran ma instrukcję „arytmetyczną if”, która znajduje się w połowie drogi między obliczonym IF a instrukcją case, opartą na trychotomii x < 0, x = 0, x > 0. To była najwcześniejsza instrukcja warunkowa w Fortran:

IF (e) label1, label2, label3

Gdzie e jest dowolnym wyrażeniem liczbowym (niekoniecznie liczbą całkowitą); to jest równoważne

IF (e .LT. 0) GOTO label1
IF (e .EQ. 0) GOTO label2
GOTO label3

Ponieważ ta arytmetycznaGOTO instrukcja IF jest odpowiednikiem wielu instrukcji, które mogą przeskoczyć w dowolne miejsce, jest uważana za niestrukturalną instrukcję sterującą i nie należy jej używać, jeśli można użyć większej liczby instrukcji strukturalnych. W praktyce zaobserwowano, że większość IFzdań arytmetycznych odwołuje się do następującego zdania z jedną lub dwiema etykietami.

Była to jedyna warunkowa instrukcja sterowania w oryginalnej implementacji Fortran na komputerze IBM 704 . Na tym komputerze kod operacyjny testu i rozgałęzienia miał trzy adresy dla tych trzech stanów. Inne komputery miałyby rejestry „flagowe”, takie jak dodatni, zerowy, ujemny, parzysty, przepełnienia, przeniesienia, związane z ostatnimi operacjami arytmetycznymi i używałyby instrukcji, takich jak „Rozgałęzienie, jeśli akumulator ujemny”, a następnie „Rozgałęzienie, jeśli akumulator zero” lub podobne. Należy zauważyć, że wyrażenie jest oceniane tylko raz , aw przypadkach takich jak arytmetyka liczb całkowitych, w których może wystąpić przepełnienie, flagi przepełnienia lub przeniesienia również będą brane pod uwagę.

Implementacja obiektowa w Smalltalk

W przeciwieństwie do innych języków, w Smalltalku instrukcja warunkowa nie jest konstrukcją językową, ale zdefiniowaną w klasie Booleanjako abstrakcyjną metodę, która przyjmuje dwa parametry, oba domknięcia . Booleanma dwie podklasy Truei False, które definiują metodę, Truewykonując tylko pierwsze zamknięcie, Falsewykonując tylko drugie zamknięcie.

var = condition 
    ifTrue: [ 'foo' ]
    ifFalse: [ 'bar' ]

JavaScript

Dwa przykłady w JavaScript :

if (Math.random() < 0.5) {
  console.log("You got Heads!");
} else {
  console.log("You got Tails!");
}

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!");
}

Rachunek lambda

W rachunku lambda pojęcie warunku warunkowego jeśli-to-inaczej można wyrazić za pomocą wyrażeń:

true = λx. λy. x
false = λx. λy. y
ifThenElse = (λc. λx. λy. (c x y))
  1. true przyjmuje do dwóch argumentów i gdy oba zostaną podane (patrz currying ), zwraca pierwszy podany argument.
  2. false przyjmuje do dwóch argumentów i gdy oba zostaną podane (patrz currying ), zwraca drugi podany argument.
  3. ifThenElse przyjmuje do trzech argumentów i gdy wszystkie zostaną podane, przekazuje zarówno drugi, jak i trzeci argument do pierwszego argumentu (który jest funkcją, która podaje dwa argumenty i daje wynik). Oczekujemy, że ifThenElse przyjmie tylko prawdę lub fałsz jako argument, z których oba rzutują podane dwa argumenty na preferowany pojedynczy argument, który jest następnie zwracany.

uwaga : jeśli ifThenElse jest przekazywane dwie funkcje jako lewy i prawy warunek; Jest to konieczne , aby również przekazać pustą krotki (), aby w wyniku ifThenElse aby rzeczywiście wywołać wybraną funkcję, inaczej będzie ifThenElse tylko zwrócić przedmiot bez funkcji nazywa uzyskiwanie.

W systemie, w którym liczby mogą być używane bez definicji (np. Lisp, tradycyjna matematyka na papierze itp.), powyższe można wyrazić jako pojedyncze zamknięcie poniżej:

 ((λtrue. λfalse. λifThenElse.
     (ifThenElse true 2 3)
 )(λx. λy. x)(λx. λy. y)(λc. λl. λr. c l r))

Tutaj wartości true, false i ifThenElse są powiązane z odpowiednimi definicjami, które są przekazywane do ich zakresu na końcu ich bloku.

Działająca analogia JavaScript (używająca tylko funkcji pojedynczej zmiennej dla rygoru) to:

 var computationResult = ((_true => _false => _ifThenElse => 
     _ifThenElse(_true)(2)(3) 
 )(x => y => x)(x => y => y)(c => x => y => c(x)(y)));

Powyższy kod z funkcjami wielu zmiennych wygląda tak:

 var computationResult = ((_true, _false, _ifThenElse) =>
     _ifThenElse(_true, 2, 3)
 )((x, y) => x, (x, y) => y, (c, x, y) => c(x, y));

kolejna wersja wcześniejszego przykładu bez systemu, w którym zakładane są liczby, znajduje się poniżej.

Pierwszy przykład pokazuje, że jest pobierana pierwsza gałąź, podczas gdy drugi przykład pokazuje, że pobierana jest druga gałąź.

 ((λ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 używa podobnego pomysłu dla swoich prawdziwych i fałszywych reprezentacji, przy czym True i False są pojedynczymi obiektami, które reagują na komunikaty ifTrue/ifFalse inaczej.

Haskell używał tego dokładnego modelu dla swojego typu logicznego, ale w czasie pisania tego tekstu większość programów Haskella używa konstruktu cukru składniowego „if a then b else c”, który w przeciwieństwie do ifThenElse nie tworzy, chyba że jest opakowany w inną funkcję lub ponownie zaimplementowany jak pokazano w sekcji Haskell tej strony.

Oświadczenia dotyczące przypadków i przełączników

Instrukcje switch (w niektórych językach, instrukcje case lub rozgałęzienia wielowymiarowe) porównują daną wartość z określonymi stałymi i podejmują działania zgodnie z pierwszą stałą do dopasowania. Zwykle istnieje przepis dotyczący domyślnego działania („inaczej”, „inaczej”), które należy podjąć, jeśli żaden mecz się nie powiedzie. Instrukcje Switch mogą umożliwiać optymalizację kompilatora , na przykład tabele przeglądowe . W językach dynamicznych przypadki mogą nie ograniczać się do wyrażeń stałych i mogą rozciągać się na dopasowanie wzorców , jak w przykładzie skryptu powłoki po prawej stronie, gdzie "*)" implementuje domyślną wielkość liter jako wyrażenie regularne pasujące do dowolnego łańcucha.

Pascal : C : Skrypt powłoki :
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

Dopasowanie wzorca

Dopasowywanie wzorców może być postrzegane jako alternatywa dla instrukcji if-then-else i case . Jest dostępny w wielu językach programowania z funkcjonalnymi funkcjami programowania, takimi jak Wolfram Language , ML i wiele innych. Oto prosty przykład napisany w języku OCaml :

match fruit with
| "apple" -> cook pie
| "coconut" -> cook dango_mochi
| "banana" -> mix;;

Siłą dopasowania wzorców jest możliwość zwięzłego dopasowania nie tylko działań, ale także wartości do wzorców danych. Oto przykład napisany w języku Haskell, który ilustruje obie te cechy:

map _ []      = []
map f (h : t) = f h : map f t

Ten kod definiuje funkcję map , która stosuje pierwszy argument (funkcja) do każdego elementu drugiego argumentu (listy) i zwraca wynikową listę. Dwie linie to dwie definicje funkcji dla dwóch możliwych w tym przypadku rodzajów argumentów – jeden, w którym lista jest pusta (po prostu zwróć pustą listę), a drugi przypadek, w którym lista nie jest pusta.

Dopasowywanie wzorców nie jest ściśle mówiąc zawsze konstrukcją wyboru, ponieważ w Haskell można napisać tylko jedną alternatywę, która ma gwarancję dopasowania – w tej sytuacji nie jest używana jako konstrukt wyboru, ale po prostu jako sposób powiązać nazwy z wartościami. Jednak jest często używany jako konstrukcja do wyboru w językach, w których jest dostępny.

Warunki warunkowe oparte na hashu

W językach programowania, które mają tablice asocjacyjne lub porównywalne struktury danych, takie jak Python , Perl , PHP lub Objective-C , idiomatyczne jest ich użycie do implementacji przypisania warunkowego.

pet = input("Enter the type of pet you want to name: ")
known_pets = {
    "Dog": "Fido",
    "Cat": "Meowsles",
    "Bird": "Tweety",
}
my_name = known_pets[pet]

W językach, które mają funkcje anonimowe lub które umożliwiają programiście przypisanie nazwanej funkcji do odwołania do zmiennej, przepływ warunkowy można zaimplementować przy użyciu skrótu jako tabeli wysyłania .

Orzeczenie

Alternatywą dla warunkowych instrukcji rozgałęzienia jest orzekanie . Predykacja to funkcja architektury, która umożliwia warunkowe wykonywanie instrukcji zamiast modyfikowania przepływu sterowania .

Odniesienie do systemu wyboru

Ta tabela odnosi się do najnowszej specyfikacji językowej każdego języka. W przypadku języków, które nie mają specyfikacji, odwołuje się do najnowszej oficjalnie wydanej implementacji.

Język programowania Zorganizowany, jeśli przełącznik – wybierz – przypadek Arytmetyka, jeśli Dopasowanie wzorca
następnie w przeciwnym razie inaczej-jeśli
Ada tak tak tak tak Nie Nie
APL tak tak tak tak Nie Nie
Bash powłoki tak tak tak tak Nie tak
C , C++ tak tak tak Upadek Nie Nie
C# tak tak Niepotrzebne tak Nie Nie
COBOL tak tak Niepotrzebne tak Nie Nie
Eiffla tak tak tak tak Nie Nie
F# tak tak tak Niepotrzebne Nie tak
Fortran 90 tak tak tak tak tak Nie
Udać się tak tak Niepotrzebne tak Nie Nie
Haskell tak Potrzebne Niepotrzebne Tak, ale niepotrzebne Nie tak
Jawa tak tak Niepotrzebne Upadek Nie Nie
ECMAScript ( JavaScript ) tak tak Niepotrzebne Upadek Nie Nie
Matematyka tak tak tak tak Nie tak
Oberon tak tak tak tak Nie Nie
Perl tak tak tak tak Nie Nie
PHP tak tak tak Upadek Nie Nie
Pascal , obiekt Pascal ( Delphi ) tak tak Niepotrzebne tak Nie Nie
Pyton tak tak tak Nie Nie Nie
QuickBASIC tak tak tak tak Nie Nie
Rubin tak tak tak tak Nie tak
Rdza tak tak tak Niepotrzebne Nie tak
Scala tak tak Niepotrzebne Upadek Nie tak
SQL tak tak tak tak Nie Nie
Szybki tak tak tak tak Nie tak
Tcl tak tak tak tak Nie tak
Visual Basic , klasyczny tak tak tak tak Nie Nie
Visual Basic .NET tak tak tak tak Nie Nie
Windows PowerShell tak tak tak Upadek Nie Nie
  1. ^ Odnosi się to do dopasowywania wzorców jako odrębnej konstrukcji warunkowej w języku programowania – w przeciwieństwie do zwykłej obsługi dopasowywania wzorców ciągów, takiej jakobsługawyrażeń regularnych.
  2. 1 2 3 4 5 Często spotykanyelse ifw rodzinie języków C oraz w języku COBOL i Haskell nie jest cechą języka, ale zestawem zagnieżdżonych i niezależnych,jeśli to inaczej,instrukcji połączonych z określonym układem kodu źródłowego. Oznacza to jednak również, że odrębna konstrukcja else-if nie jest tak naprawdę potrzebna w tych językach.
  3. 1 2 W Haskell i F# oddzielna konstrukcja stałego wyboru nie jest potrzebna, ponieważ to samo zadanie można wykonać za pomocą dopasowywania wzorców.
  4. ^ WcasekonstrukcjiRubydopasowaniewyrażeń regularnychjest jedną z dostępnych alternatyw warunkowych kontroli przepływu. Aby zapoznać się z przykładem, zobacztopytanie dotyczące przepełnienia stosu.
  5. 1 2 SQL ma dwie podobne konstrukcje, które spełniają obie role, obie wprowadzone wSQL-92. CASEWyrażenie„wyszukiwane”CASE WHEN cond1 THEN expr1 WHEN cond2 THEN expr2 [...] ELSE exprDflt ENDdziała jakif ... else if ... else, podczas gdy „prosteCASE” wyrażenie:CASE expr WHEN val1 THEN expr1 [...] ELSE exprDflt ENDdziała jak instrukcja switch. Aby uzyskać szczegółowe informacje i przykłady, zobaczCase (SQL).
  6. ^ Arytmetykaifjest przestarzała w Fortranie 90.
  7. ^ Dopasowanie wzorców zostało dodane w Ruby 3.0. Niektóre konstrukty dopasowujące do wzorców są nadal eksperymentalne.

Zobacz też

Bibliografia

Zewnętrzne linki