Странная реакция компилятора на тернарный оператор

 

Есть метод у меня:

bool PositionHandling :: checkLevelsBLOCK(SymbolProperties& Sym,               // Структура данных рыночного окружения выбранного инструмента
                                          PositionProperties& Pos,             // Структура свойств позиции
                                          int     operationType,               // Тип проводимой операции: 1 - Close/Del; 2 - Send; 3 - Modify;
                                          double& newOpenPrice,                // Новая цена открытия
                                          bool&   invalidPriceCorrection) {    // Флаг первоначальной коррекции отложки
  bool existFreezeLevel = false,
       existStopLevel = false;
  //----
  Sym.stopLevel = (int)(MarketInfo(Pos.instrument, MODE_STOPLEVEL) * Sym.pt);
  Sym.freezeLevel = (int)(MarketInfo(Pos.instrument, MODE_FREEZELEVEL) * Sym.pt);
  Sym.stopLevel > 0 ? existStopLevel = checkDemandsForStopLevel(Sym, Pos, operationType, newOpenPrice, invalidPriceCorrection) : existStopLevel = false;
  Sym.freezeLevel > 0 ? existFreezeLevel = checkDemandsForFreezeLevel(Sym, Pos, operationType, newOpenPrice) : existFreezeLevel = false;

  if ((existStopLevel == true) && (existFreezeLevel == true))
    return (true);
  return (false);
}

Компилятор пишет, что с строках:

Sym.stopLevel > 0 ? existStopLevel = checkDemandsForStopLevel(Sym, Pos, operationType, newOpenPrice, invalidPriceCorrection) : existStopLevel = false;
Sym.freezeLevel > 0 ? existFreezeLevel = checkDemandsForFreezeLevel(Sym, Pos, operationType, newOpenPrice) : existFreezeLevel = false;

expression has no effect PositionHandling.mqh 867 21

expression has no effect PositionHandling.mqh 868 23

С чего бы это вдруг? Ведь я передаю переменную структуры Sym.stopLevel в эту функцию и если она > 0, то локальная переменная получает значение в зависимости от выполнения другого метода, иначе она становится false. В логике всё в порядке. МКЛ с тернарными оператора не дружит нормально или что?
 

А так:

   existStopLevel=(Sym.stopLevel>0) ? checkDemandsForStopLevel(Sym,Pos,operationType,newOpenPrice,invalidPriceCorrection) : false;

?

 

запись неправильная, смотрим в хелп

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

выражение? выражение: выражение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); // если размах ненулевой

 

 
hoz:
С чего бы это вдруг?

это предупреждение а не ошибка. выдает потому что результат оператора ничему не присваивается.

в данном случае на нее можно не обращать внимания.

 

Не люблю эти "вопросики" - обычный if - порождает код одинаковой эффективности, а вот разбираться в выражении с "воспросиком", на мой взгляд, куда сложнее, чем в выражении с if'ом.

Собственно, выше у Алексея - оба варианта даны, и мне больше нравится обычный if

 
George Merts:

Не люблю эти "вопросики" - обычный if - порождает код одинаковой эффективности, а вот разбираться в выражении с "воспросиком", на мой взгляд, куда сложнее, чем в выражении с if'ом.

Собственно, выше у Алексея - оба варианта даны, и мне больше нравится обычный if

Раньше пахали сохой на кобыле, может и это кому-то больше нравится.

Всё что вы сказали всего-лишь оправдание ленивости выучить, понять что-то новое. Хотя понимание не означает тупого применения везде и всюду.

С праздником...

 
George Merts:

Не люблю эти "вопросики" - обычный if - порождает код одинаковой эффективности, а вот разбираться в выражении с "воспросиком", на мой взгляд, куда сложнее, чем в выражении с if'ом.

Собственно, выше у Алексея - оба варианта даны, и мне больше нравится обычный if

Согласен, для меня if более нагляден, тернарный оператор не читается на автомате

Причина обращения: