If

PcSA

if - słowo kluczowe języka Delphi rozpoczynające instrukcje warunkową

Ta właśnie instrukcja jest używana przez wszystkich programistów najczęściej. Samo słowo "if" oznacza "jeśli/jeżeli". Instrukcja if sprawdza czy został spełniony jakiś warunek. Samo if niestety do niczego nam się nie przyda dlatego, po instrukcji i i wpisaniu odpowiedniego warunku do spełnienia, dodajemy jeszcze słowo kluczowe then. "Then" oznacza, że jeżeli warunek został spełniony to możemy wykonać dalszą część kodu.

Składnia:
if ([not] warunek) [(and|or) ([not] warunek2) [...]] then (warunek spełniony) [else (warunek niespełniony)]

Przeanalizujmy teraz poniższy kod:

if 14 > 2 then ShowMessage('14 jest większe od 2' );

Powyższy kod zawsze zawsze pokaże komunikat 14 jest większe od 2, ponieważ warunek jest prawdziwy.

A oto kolejny przykład:

if Length('abcd') < 3 then ShowMessage('Tekst jest zbyt krótki');
ShowMessage('Wprowadź dłuższy tekst');

W powyższym przykładzie tak naprawdę niepotrzebnie użyłem dwukrotnie ShowMessage, ale to tylko przykład więc może być.

W kodzie użyłem funkcji Length - która zwraca długość np. łańcucha tekstowego. Od razu mogę powiedzieć, że powyższy kod jest niepoprawny, ale nie cały. Chodzi tu o to aby pokazać jak pod jedną jedną instrukcję if dodać większa ilość kodu niż tylko jedna linijka. Błąd polega na tym, że mimo, że komunikat Tekst jest zbyt krótki nigdy się nie wyświetli (ponieważ długość łańcucha tekstowego abcd wynosi 4) to drugi komunikat niestety się nam pokaże. Aby tego uniknąć po słowie kluczowym then powinniśmy dodać Begin, potem nasze instrukcje do wykonania, a na samym końcu zakończyć warunek poprzez End.

Czyli powyższy kod powinien tak naprawdę wyglądać tak:

  if Length('abcd') < 3 then 
  begin
    ShowMessage('Tekst jest zbyt krótki');
    ShowMessage('Wprowadź dłuższy tekst');
  end;

Teraz już będzie wszystko OK. Nie wyświetli nam się żaden komunikat, dopóki długość łańcucha tekstu jest większa niż 3.

Warunek może składać się z kilku wyrażeń połączonych operatorami logicznymi. Jeżeli chcemy by tak było to należy pamiętać o tym, że każde z wyrażeń należy wziąć w nawias okrągły, np.:

if (3 > 2) and (Length('aaa') > 1) then
  ShowMessage('3 > 2 i długość stringu "aaa" jest większa od 1');

W przypadku sprawdzania logicznego typu danych, w warunku nie trzeba dopisywać = True :

if Pokaz then // zamiast: if Pokaz = True
  ShowMessage('3 > 2 i długość stringu "aaa" jest większa od 1');

Ponadto, w celu optymalizacji, należy zwrócić na kolejność warunków. Podając je w kolejności od najmniej prawdopodobnego nie stracimy czasu na sprawdzanie pozostałych, ponieważ jeśli już pierwszy zwróci False, program nie będzie sprawdzał kolejnych lecz przejdzie do kolejnej instrukcji.

Zobacz też:

5 komentarzy

Może rzeczywiście trochę przesadziłem z tą składnią, ale chciałem pokazać możliwie jak najdokładniej z czego można zbudować warunek. Chyba najlepszym rozwiązaniem byłoby przedstawienie tego jak jest w helpie, czyli: "if expression1 then [ if expression2 then statement1 else statement2 ];". Oczywiście trzeba to opatrzyć to linkami.

Tak, macie rację...

Ogólnie popieram Wolverine'a :). Ale dodam jeszcze jeden argument: Z tego co jest napisane na początku to możnaby wywnioskować dwa błędne sformuowania:

  1. Jedynymi funktorami zdaniotwórczymi (logicznymi) są and, or i not
  2. Nie można konstruować rozbudowanych zapytań, tylko łączyć nieskończenie wiele prostych wyrażeń bez używania nawiasów itp.
    Oczywiście skonstruowanie tego w ten sposób;
    if warunek then instrukcja else instrukcja byłoby dużo bardziej na miejscu. Wówczas samo określenie instrukcja mogłoby oznaczać równiedobrze blok instrukcji między słowami begin i end, zaś warunek może być bardzo skomplikowany, może posiadaćwiele różnych funktorów, funkcji logicznych, porównań i czego sobie jeszcze tam nie wymyślimy. A sama konstrukcja warunku mogłaby spokojnie być oddzielnym wpisem.

jakbym nie wiedział do czego if służy to
if ([not] warunek) [(and|or) ([not] warunek2) [...]] then (warunek spełniony) [else (warunek niespełniony)]
by mi nic nie powiedziało bo dałeś za dużo nawiasów tzn powinieneś zamiast [not] napisać że not jest negacją warunku i tyle

Wolverine ma rację, a ja bym jeszcze dodał konstrukcję
if warunek then
begin

end
else if warunek then
begin

end
else begin

end

Ja bym to zrobil tak, if (warunek) then (warunek spełniony) [else (warunek niespełniony)] i warunek niech bedzie linkiem do wyrazen logicznych. Chodzi mi o przedstawienie tego "typu" jakim jest boolean i, ze operacje na nim mozna robic wszedzie, nie tylko w if'ach. np

b: boolean;
begin
b = not (2 > 3) and (3 = 3);