2. MQL4 dla początkujących. Część II.

2.2. Operator warunkowy if ... else

Zasady działania operatorów if oraz else zostały opisane w rozdziale 1.10. Operator warunkowy if ... else. Jeśli już załapałeś o co w tym chodzi to nadszedł czas poznać kilka nowych trików.

Przypomnę, że po operatorze if między klamrami { }, tj. w ciele operatora, należy opisać pożądane działania. Ta sama zasada dotyczy i operatora else.

Kod 1
#property strict

int A = 0 , B = 0;
  
void OnStart()
  {
//---
   if(A == 555)  // Wynik porównania - fałsz, działanie przechodzi do operatora 'else'
     {
      B = 100;
     }
   else
     {
      B = 200;   // zmienna B przyjmuje wartość 200
     }
//---
   Print("B = " , B);  // B = 200
  }

W przypadku jeśli po if między klamrami znajduje się tylko jedna instrukcja (B = 100) to klamry można nie pisać. Tak samo można postąpić i w przypadku else. W powyższym przykładzie po else między klamrami też widzimy tylko jedną instrukcję (B = 200), dlatego klamry też można pominąć (kod 2).

Kod 2
#property strict

int A = 0 , B = 0;
  
void OnStart()
  {
//---
   if(A == 555)  // Wynik porównania - fałsz, działanie przechodzi do operatora 'else'
      B = 100;
   else
      B = 200;   // zmienna B przyjmuje wartość 200
//---
   Print("B = " , B);  // B = 200
  }

To jest ten sam kod co i poprzedni tylko nieco odchudzony, bo nie ma tu klamer. Jeśli zaś po operatorach if lub else trzeba zapisać 2 lub więcej instrukcji to muszą one być zapisane między klamrami (kod 3).

Kod 3
#property strict

int A = 0 , B = 0 , C = 0;

void OnStart()
  {
//---
   if(A == 555) // Wynik porównania - fałsz, działanie przechodzi do operatora 'else'
     {
      B = 100;
      C = 111;
     }
   else
     {
      B = 200;  // zmienna B przyjmuje wartość 200
      C = 222;  // zmienna C przyjmuje wartość 222
     }
//---
   Print("B = " , B , " a C = " , C); // B = 200 a C = 222
  }

W powyższym przykładzie widzimy, że dwie instrukcje (B = 100 oraz C = 111) odnoszą się do if i zostały by zrealizowane, gdyby warunek był prawdziwy, ponieważ znajdują się wewnątrz klamer. Dwie instrukcje (B = 200 oraz C = 222) odnoszą się do else i też są zapisane między klamrami.

Stosowanie operatora else nie jest konieczne jeśli nie przewiduje się alternatywnego działania. Jeśli w kodzie 3 zostanie usunięty else wraz z {...}, to początkowe wartości B i C nie ulegną zmianie i nadal będą równe 0 (kod 4).

Kod 4
#property strict

int A = 0 , B = 0 , C = 0;

void OnStart()
  {
//---
   if(A == 555) // Wynik porównania - fałsz
     {
      B = 100;
      C = 111;
     }
                // ponieważ nie ma 'else' B i C nadal będą równe 0
//---
   Print("B = " , B , " a C = " , C);  // B = 0 a C = 0
  }

A co się stanie jeśli usuniemy klamry i po if ? Zrób to i uruchom taki skrypt (kod 5) w MetaTrader 4.

Kod 5
#property strict

int A = 0 , B = 0 , C = 0;

void OnStart()
  {
//---
   if(A == 555) // Wynik porównania - fałsz
      B = 100;  // B nie przyjmuje wartość 100
      C = 111;  // C przyjmuje wartość 111
//---
   Print("B = " , B , " a C = " , C);  // B = 0 a C = 111
  }

W tym przypadku bez klamer tylko jedna instrukcja (B = 100) będzie uzależniona od operatora if. Druga instrukcja (C = 111) zostanie zrealizowana niezależnie od if, ponieważ w takim układzie nie jest ona powiązana z tym operatorem.