Loading AI tools
Z Wikipedii, wolnej encyklopedii
Instrukcja warunkowa – element języka programowania, który pozwala na wykonanie różnych instrukcji w zależności od tego czy zdefiniowane przez programistę wyrażenie logiczne jest prawdziwe, czy fałszywe. Możliwość warunkowego decydowania o tym, jaki krok zostanie wykonany w dalszej kolejności jest jedną z podstawowych własności współczesnych komputerów – dowolny model obliczeń zdolny do wykonywania algorytmów (tj. równoważny maszynom Turinga) musi ją posiadać[1].
W imperatywnych językach programowania używa się terminu instrukcja warunkowa, podczas gdy w programowaniu funkcyjnym preferowane są nazwy wyrażenie warunkowe lub konstrukcja warunkowa, gdyż posiadają one inną zasadę działania.
W teorii złożoności obliczeniowej maszyna Turinga jest wzorcowym, matematycznym modelem obliczeń komputerowych zdolnym do wykonywania algorytmów[2]. Składa się ona z nieskończonej taśmy podzielonej na komórki z symbolami oraz głowicy. W każdym kroku głowica może zmienić symbol nad aktualnie przeglądaną komórką, zmienić swój stan oraz przesunąć się w lewo lub w prawo. Program definiowany jest jako tablica stanów i dopuszczalnych przejść między nimi w zależności od widzianego symbolu[3]. Możemy ją rozpatrywać jako rodzaj warunku, a każdy krok obliczeń – jako jego ewaluację[4]. Przykładowo, element tablicy przejść może być rozumiany jako warunek „jeśli jesteśmy w stanie 2 i widzimy symbol a, przechodzimy do stanu 4, zapisujemy symbol c i przesuwamy się w lewo”.
We współczesnych językach programowania można spotkać wiele rodzajów instrukcji warunkowych.
Podstawowym rodzajem instrukcji warunkowej jest If-Then. Jest spotykany w większości języków programowania i umożliwia warunkowe wykonanie określonego bloku kodu, a jeśli warunek nie jest spełniony – alternatywnego bloku. Pomiędzy językami występują nieznaczne różnice składniowe, ale ogólny schemat w pseudokodzie zawsze wygląda następująco:
if warunek then właściwy blok kodu else alternatywny blok kodu end if
Na początku wykonywana jest ewaluacja warunku podanego w postaci wyrażenia logicznego. Jeśli wynikiem jest true, wykonywany jest właściwy blok kodu, a jeśli false – alternatywny. Następnie program kontynuuje od pierwszej komendy po end if.
Wiele języków programowania umożliwia zdefiniowanie więcej niż jednego warunku do sprawdzenia przy pomocy opcjonalnego bloku else-if:
if warunek 1 then pierwszy blok kodu else-if warunek 2 then drugi blok kodu else-if warunek 3 then trzeci blok kodu else alternatywny blok kodu end if
W tym wypadku warunki ewaluowane są po kolei do momentu, gdy któryś z nich nie da wartości true – wykonywany jest wtedy przypisany mu blok kodu. Jeśli żaden z warunków nie będzie prawdziwy, wykonywany jest blok alternatywny. Bez względu na ilość prawdziwych warunków, zawsze wykona się tylko pierwszy z nich, a pozostałe zostaną pominięte.
W pewnych językach programowania dostępna jest konstrukcja analogiczna do opisanej wyżej instrukcji warunkowej, której działanie jest jednak odwrotne do powyższego, tzn. pierwszy blok kodu wykonywany jest, gdy warunek 1 nie jest spełniony, a inne warunki fraz else w przeciwnym razie. Jest to więc równoważnik konstrukcji if not(warunek) then instrukcja
. Dla odróżnienia od konstrukcji pierwotnej stosuje się w tym przypadku inne słowo kluczowe, np. unless, w języku BCPL[5] i pochodnych (np. w język MCPL[6]), czy także w Perl[7].
Wyrażenie warunkowe jest odmianą instrukcji warunkowej If-Then z tą różnicą, że wykonany blok kodu musi zwrócić jakąś wartość, która staje się jednocześnie wynikiem całego wyrażenia. Wyrażenia warunkowe są popularne w funkcyjnych językach programowania.
W językach wywodzących się z C dostępny jest trójargumentowy operator zwany także operatorem wyrażenia warunkowego. Schemat składni jest następujący:
(warunek)? (wyrażenie, gdy warunek jest prawdziwy): (wyrażenie, gdy warunek jest fałszywy)
Efektem jego działania jest wartość drugiego lub trzeciego wyrażenia. Umożliwia on osadzanie warunków wewnątrz wyrażeń, np.
zmienna = (a > 5) ? (a * 7) : (a - 3);
W językach Visual Basic oraz SQL warunek jest funkcją trójargumentową. Działa ona trochę inaczej, niż klasyczne wyrażenie warunkowe, gdyż w trakcie wykonywania obliczana jest zawsze zarówno „prawdziwa”, jak i „fałszywa gałąź”, a funkcja zwraca po prostu wynik jednej z nich, drugi odrzucając.
Język Fortran do wersji Fortran 77 obsługiwał tzw. arytmetyczny If będący czymś pomiędzy klasycznym Ifem a przypadkiem instrukcji wyboru bazującym na trychotomii Był to najwcześniejszy rodzaj instrukcji warunkowej spotykanej w tym języku[8]:
IF (e) label1, label2, label3
Gdzie e to dowolne wyrażenie numeryczne. Powyższy zapis jest równoważny następującemu:
IF (e .LT. 0) GOTO label1
IF (e .EQ. 0) GOTO label2
IF (e .GT. 0) GOTO label3
Smalltalk to język w pełni obiektowy. Warunki nie są tam instrukcją języka, lecz metodą klasy Boolean
przyjmującą dwa domknięcia jako argumenty. Klasa Boolean
posiada dwie klasy podrzędne: True
, która wykonuje tylko pierwsze z domknięć, oraz False
wykonującą drugie:
var := condition
ifTrue: [ 'foo' ]
ifFalse: [ 'bar' ]
Innym rodzajem instrukcji warunkowej jest Instrukcja wyboru, która dopasowuje obliczoną wcześniej wartość do zdefiniowanych ograniczeń i wykonuje akcję przyporządkowaną pierwszemu z nich, który zostanie poprawnie dopasowany.
Bardziej wyspecjalizowaną odmianą instrukcji warunkowych jest Dopasowanie do wzorca spotykane w niektórych językach programowania. Jego specjalizacja polega na możliwości analizy budowy złożonych struktur danych oraz automatycznego rozpakowywania z nich wartości do zmiennych.
Język programowania | Strukturalny If | Instrukcja wyboru | Arytmetyczny If | Dopasowywanie do wzorca | ||
---|---|---|---|---|---|---|
then | else | else-if | ||||
Ada[9] | Tak | Tak | Tak | Tak | Nie | Nie |
C | Tak | Tak | Nie | Tak | Nie | Nie |
C++ | Tak | Tak | Nie | Tak | Nie | Nie |
C# | Tak | Tak | Nie | Tak | Nie | Nie |
Comal[10] | Tak | Nie | Nie | Tak | Nie | Nie |
Eiffel | Tak | Tak | Tak | Tak | Nie | Nie |
F# | Tak | Tak | Tak | Nie | Nie | Tak |
Forth[10][11][12] | Tak | Tak | Nie | Nie | Tak | Nie |
Fortran | Tak | Tak | Tak | Tak | Tak | Nie |
Haskell | Tak | Tak | Nie | Nie | Nie | Tak |
Java | Tak | Tak | Nie | Tak | Nie | Nie |
JavaScript | Tak | Tak | Nie | Tak | Nie | Nie |
Modula 2[13] | Tak | Tak | Nie | Tak | Nie | Nie |
Pascal[10][14][15] | Tak | Tak | Nie | Tak | Nie | Nie |
Perl | Tak | Tak | Tak | Tak | Nie | Nie |
PHP | Tak | Tak | Tak | Tak | Nie | Nie |
PL/1[16][17] | Tak | Tak | Nie | Tak | Nie | Nie |
PL/M[18][19] | Tak | Tak | Nie | Nie | Tak | Nie |
Python | Tak | Tak | Tak | Nie | Nie | Nie |
Snobol[20] | Nie | Nie | Nie | Nie | Nie | Tak |
QuickBASIC | Tak | Tak | Tak | Tak | Tak | Nie |
Visual Basic | Tak | Tak | Tak | Tak | Nie | Nie |
Visual Basic .NET | Tak | Tak | Tak | Tak | Nie | Nie |
Windows PowerShell | Tak | Tak | Tak | Tak | Nie | Nie |
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.