Condițional (programare computerizată) - Conditional (computer programming)

Image
Diagrama fluxului If-Then-Else
Image
O diagramă de flux „Dacă – Atunci – Altfel” imbricată

În informatică , condiționalele (adică enunțurile condiționale , expresiile condiționate și constructele condiționate ) sunt comenzi de limbaj de programare pentru gestionarea deciziilor. În mod specific, condiționalele efectuează diferite calcule sau acțiuni în funcție de faptul dacă o condiție booleană definită de programator se evaluează ca fiind adevărată sau falsă. În ceea ce privește fluxul de control , decizia se realizează întotdeauna prin modificarea selectivă a fluxului de control pe baza unor condiții (în afară de cazul predicării ramurilor ).

Deși dispecerizarea dinamică nu este de obicei clasificată ca o construcție condițională, este o altă modalitate de a selecta între alternative în timpul rulării .

Terminologie

În limbajele de programare imperative , termenul „ afirmație condițională ” este de obicei folosit, în timp ce în programarea funcțională , termenii „ expresie condițională ” sau „construct condițional” sunt preferați, deoarece acești termeni au înțelesuri distincte.

Dacă – atunci (–else)

if–thenConstructul (numit uneori if–then–else) este comună în multe limbaje de programare. Deși sintaxa variază de la o limbă la alta, structura de bază ( sub formă de pseudocod ) arată astfel:

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

De exemplu:

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

În exemplul de cod de mai sus, partea reprezentată prin (condiție booleană) constituie o expresie condițională , având valoare intrinsecă (de exemplu, poate fi înlocuită cu oricare dintre valori Truesau False), dar nu are nicio semnificație intrinsecă. În contrast, combinația acestei expresii, a Ifși Thenînconjurătorul acesteia și consecința care urmează ulterior constituie o afirmație condițională , având semnificație intrinsecă (de exemplu, exprimând o regulă logică coerentă), dar fără valoare intrinsecă.

Când un interpret găsește o If, se așteaptă la o condiție booleană - de exemplu, x > 0care înseamnă „variabila x conține un număr mai mare decât zero” - și evaluează acea condiție. Dacă condiția este true, declarațiile care urmează thensunt executate. În caz contrar, execuția continuă în următoarea ramură - fie în else bloc (care este de obicei opțional), fie dacă nu există elseramură, apoi după end If.

După executarea oricărei ramuri, controlul revine la punctul de după end If.

Istorie și dezvoltare

În limbajele de programare timpurii, în special în unele dialecte ale BASIC din computerele de acasă din anii 1980 , o if–thendeclarație putea conține doar GOTOafirmații (echivalente cu o instrucțiune de ramură ). Acest lucru a dus la un stil greu de citit de programare cunoscut sub numele de programare spaghetti , cu programe în acest stil numite cod spaghetti . Ca rezultat, programarea structurată , care permite ca declarațiile (practic) arbitrare să fie plasate în blocuri de declarații în cadrul unei ifdeclarații, a câștigat popularitate, până când a devenit normă chiar și în majoritatea cercurilor de programare BASIC. Astfel de mecanisme și principii s-au bazat pe familia de limbi ALGOL mai vechi, dar mai avansată , iar limbajele asemănătoare ALGOL, cum ar fi Pascal și Modula-2, au influențat de mulți ani variantele BASIC moderne. Deși este posibil în timp ce se utilizează numai GOTOenunțuri în if–thenenunțuri pentru a scrie programe care nu sunt cod spaghetti și sunt la fel de bine structurate și lizibile ca programele scrise într-un limbaj de programare structurat, programarea structurată face acest lucru mai ușor și îl aplică. if–then–elseAfirmațiile structurate precum exemplul de mai sus sunt unul dintre elementele cheie ale programării structurate și sunt prezente în cele mai populare limbaje de programare la nivel înalt, cum ar fi C , Java , JavaScript și Visual Basic .

Problema „altceva atârnând”

Cuvântul elsecheie este făcut pentru a viza o if–thendeclarație specifică care o precedă, dar pentru instrucțiunile imbricate if–then , limbajele de programare clasice, cum ar fi ALGOL 60, s-au luptat să definească ce instrucțiune specifică să vizeze. Fără limite clare pentru care afirmație este care, un elsecuvânt cheie ar putea viza orice if–thenafirmație precedentă din cuib, așa cum este analizat.

if a then if b then s else s2

poate fi analizat ca

if a then (if b then s) else s2

sau

if a then (if b then s else s2)

în funcție de dacă elseeste asociat cu primul ifsau al doilea if. Aceasta este cunoscută sub numele de problema „ altcineva” și se rezolvă în diferite moduri, în funcție de limbă (de obicei prin end ifdeclarație sau {...}paranteze).

Altfel dacă

Prin utilizare else if, este posibil să combinați mai multe condiții. Vor fi executate numai declarațiile care urmează primei condiții care se găsește adevărată. Toate celelalte declarații vor fi omise.

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

De exemplu, pentru un magazin care oferă până la o reducere de 30% pentru un articol:

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;

elseifDeclarația, în Ada limba , de exemplu, este pur și simplu de zahăr sintactică pentru elseurmat de if. În Ada, diferența este că end ifeste nevoie de unul singur, dacă se folosește elseifîn loc de elseurmat de if. PHP folosește elseifcuvântul cheie atât pentru parantezele bucle, fie pentru sintaxele de două puncte. Perl furnizează cuvântul cheie elsifpentru a evita numărul mare de aparate dentare care ar fi cerute de multiple ifși elsedeclarații. Python folosește cuvântul cheie special elifdeoarece structura este mai degrabă denotată prin indentare decât paranteze, deci o utilizare repetată a elseși ifar necesita o indentare crescută după fiecare condiție. Unele implementări ale BASIC , cum ar fi Visual Basic , folosesc și ElseIfele. În mod similar, shell-urile UNIX anterioare (adunate mai târziu până la sintaxa shell POSIX) folosesc și elif, dar oferind posibilitatea de a delimita cu spații, întreruperi de linie sau ambele.

Cu toate acestea, în multe limbi descendente direct din Algol, cum ar fi Simula , Pascal , BCPL și C , această sintaxă specială pentru else ifconstruct nu este prezentă și nici nu este prezentă în numeroasele derivate sintactice ale lui C, cum ar fi Java , ECMAScript și curând. Acest lucru funcționează pentru că în aceste limbi, orice singură declarație (în acest caz ...) poate urma o condițională , fără a fi închisă într - un bloc. if cond

Această alegere de design are un ușor „cost”. Fiecare else iframură adaugă efectiv un nivel suplimentar de cuibărire. Acest lucru complică treaba pentru compilator (sau persoanele care scriu compilatorul), deoarece compilatorul trebuie să analizeze și să implementeze în mod arbitrar else iflanțuri lungi recursiv.

Dacă toți termenii din secvența de condiționali testează valoarea unei singure expresii (de exemplu, if x=0... else if x=1... else if x=2...), o alternativă este instrucțiunea switch , numită și instrucțiune caz sau instrucțiune select. În schimb, în ​​limbile care nu au o declarație switch, acestea pot fi produse printr-o succesiune de else ifinstrucțiuni.

Expresii dacă – atunci – altfel

Multe limbi acceptă expresiile if , care sunt similare cu instrucțiunile if, dar returnează o valoare ca rezultat. Astfel, ele sunt expresii adevărate (care se evaluează la o valoare), nu declarații (care nu pot fi permise în contextul unei valori).

Familia Algol

ALGOL 60 și alți membri ai familiei ALGOL permit if–then–elseca expresie:

  myvariable := if x > 20 then 1 else 2

Dialecte Lisp

În dialectele Lisp  - Scheme , Racket și Common Lisp  - primul dintre care a fost inspirat în mare măsură de 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

În Haskell 98, există doar o expresie if , no if statement și elsepartea este obligatorie, deoarece fiecare expresie trebuie să aibă o anumită valoare. Logica care ar fi exprimată cu condiționali în alte limbi este de obicei exprimată cu potrivirea modelelor în funcții recursive.

Deoarece Haskell este leneș , este posibil să scrieți structuri de control, cum ar fi dacă , ca expresii obișnuite; evaluarea leneșă înseamnă că o funcție if poate evalua doar starea și ramura adecvată (unde un limbaj strict ar evalua toate cele trei). Se poate scrie astfel:

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

Limbi asemănătoare cu cele C

Limbajele C și C au un operator ternar special ( ? :) Pentru expresiile condiționate cu o funcție care poate fi descrisă de un șablon ca acesta:

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

Aceasta înseamnă că poate fi înclinat în expresii, spre deosebire de declarațiile if, în limbaje asemănătoare cu C:

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

care poate fi comparată cu expresiile Algol-family if – then – else (spre deosebire de o afirmație ) (și similare în Ruby și Scala, printre altele).

Pentru a realiza același lucru folosind o instrucțiune if, aceasta ar necesita mai mult de o linie de cod (în conformitate cu convențiile tipice de aspect) și ar necesita menționarea „variabilei mele” de două ori:

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

Unii susțin că afirmația explicită if / then este mai ușor de citit și că se poate compila într-un cod mai eficient decât operatorul ternar, în timp ce alții susțin că expresiile concise sunt mai ușor de citit decât afirmațiile răspândite pe mai multe linii care conțin repetare.

Mic de bază

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

În primul rând, când utilizatorul rulează programul, apare un cursor în așteptarea cititorului pentru a introduce un număr. Dacă numărul respectiv este mai mare de 10, textul „Variabila mea se numește„ foo ”.” este afișat pe ecran. Dacă numărul este mai mic de 10, atunci mesajul „Variabila mea se numește„ bară ”. este imprimat pe ecran.

Visual Basic

În Visual Basic și în alte limbaje, IIfeste furnizată o funcție numită , care poate fi utilizată ca expresie condițională. Cu toate acestea, nu se comportă ca o expresie condiționată adevărată, deoarece atât ramurile adevărate, cât și cele false sunt întotdeauna evaluate; doar că rezultatul unuia dintre ele este aruncat, în timp ce rezultatul celuilalt este returnat de funcția IIf.

Tcl

În Tcl if nu este un cuvânt cheie, ci o funcție (în Tcl cunoscut sub numele de comandă sau proc). De exemplu

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

invocă o funcție numită iftrecând 2 argumente: primul fiind condiția și al doilea fiind adevărata ramură. Ambele argumente sunt transmise ca șiruri (în Tcl tot ceea ce se află între paranteze este un șir).

În exemplul de mai sus, condiția nu este evaluată înainte de a apela funcția. În schimb, implementarea iffuncției primește condiția ca valoare șir și este responsabilă de evaluarea acestui șir ca o expresie în sfera apelanților.

Un astfel de comportament este posibil prin utilizarea uplevelși exprcomenzile:

Uplevel face posibilă implementarea noilor construcții de control ca proceduri Tcl (de exemplu, nivelul superior ar putea fi utilizat pentru a implementa construcția while ca o procedură Tcl).

Deoarece ifeste de fapt o funcție, returnează și o valoare:

Valoarea returnată din comandă este rezultatul scriptului de corp care a fost executat sau un șir gol dacă niciuna dintre expresii nu a fost zero și nu a existat bodyN.

Rugini

În Rugină , ifeste întotdeauna o expresie. Se evaluează la valoarea oricărei ramuri care este executată sau la tipul de unitate ()dacă nu este executată nicio ramură. Dacă o sucursală nu furnizează o valoare de returnare, se evaluează în ()mod implicit. Pentru a se asigura că iftipul expresiei este cunoscut la momentul compilării, fiecare ramură trebuie să evalueze la o valoare de același tip. Din acest motiv, o elseramură este efectiv obligatorie, cu excepția cazului în care celelalte ramuri evaluează (), deoarece o iffără o elsepoate evalua întotdeauna la ()implicit.

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

Aritmetică dacă

Până la Fortran 77 , limba Fortran are o afirmație „aritmetică dacă” care este la jumătatea distanței dintre un IF calculat și o afirmație de caz, bazată pe trichotomia x <0, x = 0, x > 0. Aceasta a fost cea mai timpurie afirmație condițională din Fortran:

IF (e) label1, label2, label3

Unde e este orice expresie numerică (nu neapărat un număr întreg); acest lucru este echivalent cu

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

Deoarece acest IF aritmetic este echivalent cu mai multe GOTOinstrucțiuni care ar putea sări oriunde, este considerat a fi o instrucțiune de control nestructurată și nu ar trebui să fie utilizată dacă pot fi utilizate instrucțiuni mai structurate. În practică s-a observat că cele mai multe IFafirmații aritmetice au făcut referire la următoarea afirmație cu una sau două dintre etichete.

Aceasta a fost singura declarație de control condiționat din implementarea inițială a Fortran pe computerul IBM 704 . Pe acel computer, codul op-test și ramură avea trei adrese pentru aceste trei state. Alte computere ar avea registre de „semnalizare”, cum ar fi pozitive, zero, negative, pare, overflow, carry, asociate cu ultimele operații aritmetice și ar folosi instrucțiuni precum „Ramificați dacă acumulatorul este negativ”, apoi „Ramificați dacă acumulatorul este zero” sau similar. Rețineți că expresia este evaluată o singură dată și, în cazuri cum ar fi aritmetica întreagă în care poate apărea deversare, vor fi luate în considerare și semnalizările de depășire sau de transport.

Implementare orientată obiect în Smalltalk

Spre deosebire de alte limbi, în Smalltalk afirmația condițională nu este o construcție de limbaj, ci este definită în clasă Booleanca o metodă abstractă care ia doi parametri, ambii închideri . Booleanare două subclase Trueși False, care ambele definesc metoda, Trueexecutând numai prima închidere, Falseexecutând numai a doua închidere.

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

JavaScript

Două exemple în 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!");
}

Calcul Lambda

În calculul Lambda , conceptul de condițional if-then-else poate fi exprimat folosind expresiile:

true = λx. λy. x
false = λx. λy. y
ifThenElse = (λc. λx. λy. (c x y))
  1. true acceptă până la două argumente și odată ce ambele sunt furnizate (a se vedea cursul ), returnează primul argument dat.
  2. false acceptă până la două argumente și, odată ce ambele sunt furnizate (a se vedea cursul ), returnează al doilea argument dat.
  3. ifThenElse preia până la trei argumente și odată ce toate sunt furnizate, trece atât al doilea, cât și al treilea argument la primul argument (care este o funcție care a dat două argumente și produce un rezultat). Ne așteptăm ca ifThenElse să ia doar ca adevărat sau fals ca argument, ambele proiectând cele două argumente date argumentului lor preferat, care este apoi returnat.

notă : dacă ifThenElse este trecută două funcții ca condiționali stânga și dreapta; este necesar să treceți, de asemenea, un tuplu gol () la rezultatul ifThenElse pentru a apela efectiv funcția aleasă, altfel ifThenElse va returna doar obiectul funcției fără a fi chemat.

Într-un sistem în care numerele pot fi utilizate fără definiție (cum ar fi Lisp, matematica tradițională a hârtiei, așa mai departe), cele de mai sus pot fi exprimate ca o singură închidere mai jos:

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

Aici, adevărat, fals și ifThenElse sunt legate de definițiile lor respective, care sunt trecute la sfera lor de aplicare la sfârșitul blocului lor.

O analogie JavaScript funcțională (folosind doar funcții ale unei singure variabile pentru rigoare) cu aceasta este:

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

Codul de mai sus cu funcții multivariabile arată astfel:

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

o altă versiune a exemplului anterior, fără un sistem în care se presupun numere, este mai jos.

Primul exemplu arată prima ramură luată, în timp ce al doilea exemplu arată cea de-a doua ramură luată.

 ((λ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 folosește o idee similară pentru reprezentările sale adevărate și false, cu Adevărat și Fals fiind obiecte singulare care răspund la mesajele ifTrue / ifFalse diferit.

Haskell obișnuia să folosească acest model exact pentru tipul său boolean, dar la momentul scrierii, majoritatea programelor Haskell folosesc zahăr sintactic „dacă a apoi b else c”, care, spre deosebire de IfThenElse, nu compune decât dacă este înfășurat într-o altă funcție sau re-implementat așa cum se arată în secțiunea Haskell a acestei pagini.

Declarații de caz și schimbare

Instrucțiunile de comutare (în unele limbi, instrucțiuni de caz sau ramuri multiple) compară o valoare dată cu constantele specificate și acționează în funcție de prima constantă care se potrivește. De obicei, există o prevedere pentru o acțiune implicită („altfel”, „altfel”) care trebuie întreprinsă în cazul în care nicio potrivire nu reușește. Instrucțiunile de comutare pot permite optimizări ale compilatorului , cum ar fi tabelele de căutare . În limbile dinamice, cazurile nu pot fi limitate la expresii constante și se pot extinde la potrivirea modelelor , ca în exemplul scriptului shell din dreapta, unde „*)” implementează cazul implicit ca o expresie regulată care se potrivește cu orice șir.

Pascal : C : Script Shell :
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

Potrivire de model

Potrivirea tiparului poate fi văzută ca o alternativă atât la declarațiile if – then – else , cât și la caz . Este disponibil în multe limbaje de programare cu funcții de programare funcționale, cum ar fi Wolfram Language , ML și multe altele. Iată un exemplu simplu scris în limba OCaml :

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

Puterea potrivirii tiparelor este abilitatea de a potrivi concis nu numai acțiunile, ci și valorile la tiparele de date. Iată un exemplu scris în Haskell care ilustrează ambele caracteristici:

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

Acest cod definește o hartă de funcții , care aplică primul argument (o funcție) fiecăruia dintre elementele celui de-al doilea argument (o listă) și returnează lista rezultată. Cele două linii sunt cele două definiții ale funcției pentru cele două tipuri de argumente posibile în acest caz - unul în care lista este goală (trebuie doar să returnați o listă goală) și celălalt caz în care lista nu este goală.

Potrivirea tiparului nu este strict vorbind întotdeauna o construcție de alegere, deoarece în Haskell este posibil să scrieți o singură alternativă, care este garantată că va fi întotdeauna potrivită - în această situație, nu este utilizată ca o construcție de alegere, ci pur și simplu ca o modalitate pentru a lega numele de valori. Cu toate acestea, este frecvent utilizat ca o construcție de alegere în limbile în care este disponibil.

Condiționale bazate pe hash

În limbajele de programare care au matrice asociative sau structuri de date comparabile, cum ar fi Python , Perl , PHP sau Objective-C , este idiomatic să le folosiți pentru a implementa atribuirea condiționată.

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

În limbile care au funcții anonime sau care permit unui programator să atribuie o funcție numită unei referințe variabile, fluxul condițional poate fi implementat utilizând un hash ca tabel de expediere .

Predicaţie

O alternativă la instrucțiunile condiționate de ramură este predicția . Predicarea este o caracteristică arhitecturală care permite executarea condiționată a instrucțiunilor în loc de a modifica fluxul de control .

Alegerea sistemului de referință încrucișată

Acest tabel se referă la cea mai recentă specificație lingvistică a fiecărei limbi. Pentru limbile care nu au o specificație, se face referire la cea mai recentă implementare lansată oficial.

Limbaj de programare Structurat dacă comutați –selectați-majuscule Aritmetică dacă Potrivire de model
atunci altceva altceva - dacă
Ada da da da da Nu Nu
APL da da da da Nu Nu
Bash shell da da da da Nu da
C , C ++ da da da Cadea prin Nu Nu
C # da da Inutil da Nu Nu
COBOL da da Inutil da Nu Nu
Eiffel da da da da Nu Nu
F # da da da Inutil Nu da
Fortran 90 da da da da da Nu
Merge da da Inutil da Nu Nu
Haskell da Necesar Inutil Da, dar inutil Nu da
Java da da Inutil Cadea prin Nu Nu
ECMAScript ( JavaScript ) da da Inutil Cadea prin Nu Nu
Mathematica da da da da Nu da
Oberon da da da da Nu Nu
Perl da da da da Nu Nu
PHP da da da Cadea prin Nu Nu
Pascal , Object Pascal ( Delphi ) da da Inutil da Nu Nu
Piton da da da Nu Nu Nu
QuickBASIC da da da da Nu Nu
Rubin da da da da Nu da
Rugini da da da Inutil Nu da
Scala da da Inutil Cadea prin Nu da
SQL da da da da Nu Nu
Rapid da da da da Nu da
Tcl da da da da Nu da
Visual Basic , clasic da da da da Nu Nu
Visual Basic .NET da da da da Nu Nu
Windows PowerShell da da da Cadea prin Nu Nu
  1. ^ Aceasta se referă la potrivirea de tipare ca o construcție condițională distinctă în limbajul de programare - spre deosebire de simplul suport de potrivire a modelelor de șiruri, cum ar fisuportulexpresiei regulate.
  2. 1 2 3 4 5 Cel mai des întâlnitelse ifîn familia de limbi C, și în COBOL și Haskell, nu este o caracteristică de limbă, ci un set de instrucțiuni imbricate și independente,dacă altfel, combinate cu un aspect particular al codului sursă. Cu toate acestea, acest lucru înseamnă, de asemenea, că nu este nevoie de o altă construcție distinctă - dacă nu este necesară în aceste limbi.
  3. 1 2 În Haskell și F #, nu este necesară o construcție separată de alegere constantă, deoarece aceeași sarcină se poate face cu potrivirea modelelor.
  4. ^ Într-ocaseconstrucțieRuby,potrivireaexpresiei regulatese numără printre alternativele condiționale de control al fluxului disponibile. Pentru un exemplu, consultațiaceastăîntrebare Stack Overflow.
  5. 1 2 SQL are două construcții similare care îndeplinesc ambele roluri, ambele introduse înSQL-92. OCASEexpresie „căutată”CASE WHEN cond1 THEN expr1 WHEN cond2 THEN expr2 [...] ELSE exprDflt ENDfuncționează caif ... else if ... else, în timp ce oCASEexpresie „simplă”:CASE expr WHEN val1 THEN expr1 [...] ELSE exprDflt ENDfuncționează ca o instrucțiune switch. Pentru detalii și exemple, consultațiCase (SQL).
  6. ^ Aritmeticaifeste învechită în Fortran 90.
  7. ^ Potrivirea modelelor a fost adăugată în Ruby 3.0. Unele construcții de potrivire a modelelor sunt încă experimentale.

Vezi si

Referințe

linkuri externe