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.
#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).
#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).
#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).
#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.
#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.