W tym rozdziale pokażę jak można grupować kilka warunków wewnątrz operatora if. Przeanalizuj poniższy kod.
#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.
#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.