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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Viktar Dzemikhau
3386
Viktar Dzemikhau  

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

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. В логике всё в порядке. МКЛ с тернарными оператора не дружит нормально или что?
Vladimir Karputov
Модератор
182896
Vladimir Karputov  

А так:

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

?

Alexey Volchanskiy
27272
Alexey Volchanskiy  

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

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

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

 

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

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

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

Georgiy Merts
9183
Georgiy Merts  

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

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

Alexey Viktorov
25989
Alexey Viktorov  
George Merts:

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

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

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

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

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

Alexey Volchanskiy
27272
Alexey Volchanskiy  
George Merts:

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

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

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий