Русский

Справочник MQL4 Основы языка Операторы Условный оператор ?:

Условный оператор ?:

Общая форма тернарного оператора выглядит так:

выражение? выражение: выражение3

В качестве первого операнда – "выражение1" – может быть использовано любое выражение, результатом которого является значение типа bool. Если результат равен true, то выполняется оператор, заданный вторым операндом, то есть, "выражение2".

Если же первый операнд paвен false, то выполняется третий операнд – "выражениеЗ". Второй и третий операнды, то есть "выражение2" и "выражениеЗ", должны возвращать значения одного типа и не должны иметь тип void. Результатом выполнения условного оператора является результат "выражения2" либо результат "выражение3", в зависимости от результата "выражение1".

//--- пронормируем разность между ценами открытия и закрытия на дневной размах
double true_range = (High==Low)?0:(Close-Open)/(High-Low);

Эта запись эквивалентна следующей

double true_range;
if(High==Low)true_range=0;               // если High и Low равны
else true_range=(Close-Open)/(High-Low); // если размах ненулевой

 

Ограничения по использованию оператора

Оператор на основании значения "выражение1" должен вернуть одно из двух значений - либо "выражение2", либо "выражение3". Существует ряд ограничений на эти выражения:

  1. Нельзя смешивать пользовательский тип с простым типом или перечислением. Для указателя допустимо использовать NULL.
  2. Если типы значений простые, то типом оператора будет максимальный тип (смотри Приведение типов).
  3. Если одно из значений имеет тип перечисление, а второе является числовым типом, то перечисление заменяется на int и действует второе правило.
  4. Если оба значения являются значениями перечислений, то их типы должны быть одинаковыми, и типом оператора будет перечисление.

Ограничения для пользовательских типов (классов или структур):

  1. типы должны быть одинаковыми или один должен наследоваться от другого.
  2. если типы не одинаковы (наследование), то потомок неявно приводится к родителю, то есть типом оператора будет тип родителя.
  3. нельзя смешивать объект и указатель – либо оба выражения являются объектами, либо указателями. Для указателя допустимо использовать NULL.

Примечание

Будьте внимательны при использовании условного оператора в качестве аргумента перегруженной функции, так как тип результата условного оператора определяется на момент компиляции программы. И этот тип определяется как больший тип из типов "выражение2" и "выражение3".

Пример:

void func(double d) { Print("double argument: ",d); }
void func(string s) { Print("string argument: ",s); }
 
bool   Expression1=true;
double Expression2=M_PI;
string Expression3="3.1415926";
 
void OnStart()
  {
   func(Expression2);
   func(Expression3);
 
   func(Expression1?Expression2:Expression3);   // получим предупреждение компилятора о явном приведении к типу string
   func(!Expression1?Expression2:Expression3);  // получим предупреждение компилятора о явном приведении к типу string
  }
 
//   Результат:
//   double argument: 3.141592653589793
//   string argument: 3.1415926
//   string argument: 3.141592653589793
//   string argument: 3.1415926

Смотри также

Инициализация переменных, Область видимости и время жизни переменных, Создание и уничтожение объектов