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

2.6. Grupowanie warunków

W tym rozdziale pokażę jak można grupować kilka warunków wewnątrz operatora if. Przeanalizuj poniższy kod.

Kod 1
#property strict

void OnStart()
  {
   int A = 0, B = 1, C = 2, D = 3;

//---
   if(A == 0 && B < -9)      /* grupa nr 1 (A == 0 - prawda, B < -9 - fałsz)
                                ogólny wynik porównania - fałsz
                                działanie przechodzi do operatora 'else' */

      Print("Pożądane działanie nr 1.");
   else
     {
      if(C != 0 && D > -9)   /* grupa nr 2 (C != 0 - prawda, D > -9 - prawda)
                                ogólny wynik porównania - prawda */

         Print("Pożądane działanie nr 1.");
      else
         Print("Alternatywne działanie nr 2.");
     }
//---
  }

Widzimy, że pożądane działanie nr 1 zależy od tego czy porównania zmiennych A i B łącznie będą prawdziwe. Gdyby tak było, wtedy skrypt wyświetlił by komunikat zapisany w pierwszej funkcji Print() i na tym działanie skryptu skończyłoby się. U nas tak nie jest, dlatego skrypt przejdzie do else i do realizacji działań zapisanych w { }. Tam w nagłówku if widzimy drugą grupę warunków dla zmiennych C i D, gdzie oba wyrażenia są prawdziwe, dlatego zostanie wyświetlony komunikat "Pożądane działanie nr 1.". Powiedzmy, że porównania A i B to grupa nr 1, a porównania C i D to grupa nr 2.

W pierwszej grupie porównanie A z cyfrą 0 daje wynik - prawda, ale porównanie B z cyfrą -9 daję wynik - fałsz. W tej grupie zapisany jest operator iloczynu logicznego && (I), dlatego ostateczny wynik dla tej grupy to - fałsz. W drugiej grupie porównanie zarówno C jak i D daje prawdziwe wyniki i ponieważ tu też został zapisany && to wynik całej tej grupy - prawda. Gdyby się okazało, że dla obu grup wyniki porównania były by fałszywe, wtedy skrypt uruchomił by alternatywne działanie nr 2. Tak więc aby zostało zrealizowane pożądane działanie nr 1 wystarczy aby pierwsza lub druga grupa dała by wynik - prawda.

Teraz popatrz jak można ten sam kod zapisać krócej.

Kod 2
#property strict

void OnStart()
  {
   int A = 0, B = 1, C = 2, D = 3;

//---
   if( (A == 0 && B < -9) || (C != 0 && D > -9) )
      Print("Pożądane działanie nr 1.");
   else
      Print("Alternatywne działanie nr 2.");
//---
  }

Teraz w nagłówku operatora if za pomocą nawiasów utworzyliśmy grupę nr 1 (A == 0 && B < -9) i grupę nr 2 (C != 0 && D > -9). W tym przypadku operator if najpierw sprawdzi wyniki dla poszczególnych zmiennych, potem oceni jaki ogólny wynik będzie miała każda z tych grup, a następnie porówna wyniki już samych grup. Zdaję sobie sprawę z tego, że można w tym łatwo się pogubić, dlatego zobrazowałem te zależności na poniższym obrazku.

Rys. 1. Grupowanie w operatorze if.


Może też pojawić się pytanie – ile warunków lub grup warunkowych można umieścić w nagłówku operatora if? Powiem, że nie spotkałem się jeszcze z sytuacją, aby ktoś narzekał na taki problem. Także firma MetaQuotes Corp., twórca MQL4, nie podaje ograniczenia co do ilości warunków dla tego operatora.