Instrukcja warunkowa If


Istnieją dwie postacie instrukcji warunkowej: if...then oraz if...then...else (czyli postać zwykła i postać z alternatywą).

Składnia instrukcji if...then:

 if warunek then instrukcja;

gdzie warunek jest wyrażeniem logicznym zwracającym wartość typu Boolean. Jeśli warunek jest spełniony, wykonywana jest instrukcja; w przeciwnym wypadku instrukcja nie jest wykonywana. Przykład:

 if J <> 0 then Result := I/J;

Składnia instrukcji if...then...else:

 if warunek then instrukcja1 else instrukcja2;

gdzie warunek jest wyrażeniem logicznym zwracającym wartość typu Boolean. Jeśli warunek jest spełniony, wykonywana jest instrukcja1; w przeciwnym wypadku wykonywana jest instrukcja2. Przykład:

 if J = 0 then  
  Exit
 else  
  Result := I/J;

Klauzule then i else zawierają każda po jednej instrukcji, ale mogą to być instrukcje strukturalne. Przykład:

 if J <> 0 then
 begin
   Result := I/J;
   Count := Count + 1;
 end
 else if Count = Last then
   Done := True
 else
   Exit;

Należy zauważyć, że nigdy nie ma średnika między klauzulą then i else. Można zamieszczać średniki po całej instrukcji if w celu odseparowania jej od następnych instrukcji w bloku, ale klauzule then i else nie wymagają nic więcej ponad znak spacji bądź znak nowej linii pomiędzy nimi. Średnik bezpośrednio przed słowem else spowoduje bład kompilacji.

Pewne trudności pojawiają się w związku z zagnieżdżeniami instrukcji if. Problem pojawia się, gdy niektóre instrukcje if posiadają, a inne nie posiadają klauzuli else. W seriach zagnieżdżonych warunków, w których występuje różna ilość klauzuli else i instrukcji if, może nie być jasne która klauzula else jest związana z daną instrukcją if. Przykład:

if war1 then if war2 then inst1 else inst2;

Wydaje się, że mogą być dwie drogi interpretacji powyższego zapisu:

 if war1 then [ if war2 then inst1 else inst2];
 if war1 then [ if war2 then inst1 ] else inst2;

Jednak kompilator zawsze zinterpretuje analogiczny zapis w pierwszy sposób. Zatem zapis:

 if war1 then
   if war2 then
     inst1
   else
     inst2;

jest tożsamy z zapisem:

 if war1 then
 begin
   if war2 then
     inst1
   else
     inst2
 end;

Zasada jest taka, że zagnieżdżone warunki są analizowane począwszy od najbardziej zagłębionego warunku, w którym klauzula else kojażona jest z najbliższą z lewej strony instrukcją if. Sposobem na zmuszenie kompilatora do interpretacji na drugi sposób, jest zapis:

 if war1 then
 begin
   if war2 then
     inst1 
 end
 else
   inst2;