Новая версия платформы MetaTrader 5 build 4730: расширение поддержки OpenBLAS и общая оптимизация работы - страница 5

 
Roman #:

Допустимо сравнение только однотипных значений

Вы ошибаетесь.
void OnStart()
{
  uint Tmp = MQLInfoInteger(MQL_TESTER);
  
  Print(Tmp < (Tmp ? 10U : 20));    // OK
  Print(Tmp < (Tmp ? 10U : true));  // OK
  Print(Tmp < (Tmp ? false : 20U)); // OK
}


Какая потенциальная ошибка может быть в этом выражении?

  Print(Tmp < (Tmp ? 10 : 20)); // sign mismatch
 
fxsaber #:
Вы ошибаетесь.

Вы троллите или как?

false == 0
true != 0

И false/true это предопределенный тип в mql, а не числовые значения пользователя (10, 100 и т.д.) 

А то, что вот в этом примере нет предупреждения компилятора, возможно недочёт метаквотов.
Потенциально ведь может вернуться int 20

uint Tmp = MQLInfoInteger(MQL_TESTER);               

Print(Tmp < (Tmp ? 10U : 20));    // OK
 
fxsaber #:


Какая потенциальная ошибка может быть в этом выражении?

Я не знаю какая ошибка может быть, я не владею ассемблером.
Я знаю правило, и его придерживаюсь, в остальное не надо вникать.
Но предполагаю можно нарваться на усечение.
Вот скорее всего это и есть потенциальная ошибка.

 
Roman #:


И у тернарного выражения есть правило.
Допустимо сравнение только однотипных значений

и т.д. для любых типов.


Где в вашем примере сравнение?
 
Sergey Gridnev #:
Где в вашем примере сравнение?

Я исправил сообщение, не сравнение а допустимо возвращать только однотипные значения.
Опечатался чуть чуть в терминах.

 
Roman #:

И у тернарного выражения есть правило.
Допустимо возвращать только однотипные значения.

и т.д. для любых типов.

А неявное приведение типов разве работать не будет?

 
Grigori.S.B #:

А неявное приведение типов разве работать не будет?

Ну раз компилятор выдаёт предупреждение, то приводить надо явно.

 

Ну это классика при использовании тернарного оператора. Многие проходили уже, и я в том числе.

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Новая версия платформы MetaTrader 5 build 4730: расширение поддержки OpenBLAS и общая оптимизация работы

Roman, 2024.12.05 21:23

А то, что вот в этом примере нет предупреждения компилятора, возможно недочёт метаквотов.

uint Tmp = MQLInfoInteger(MQL_TESTER);               

Print(Tmp < (Tmp ? 10U : 20));    // OK

Вот это странно, хотя там 2 литерала и, возможно, компилятор умеет привести 20 к uint на этапе компиляции.

 
Vladislav Boyko #:
Вот это странно, хотя там 2 литерала и, возможно, компилятор умеет привести 20 к uint на этапе компиляции.

Нет, не в литералах дело. Он молча кастует -1 к uint даже с переменной.

void OnStart()
  {
   bool Tmp = bool(MathRand() % 2);
   int a = (MathRand() % 2 == 0) ? 1 : -1;
   uint var = Tmp ? 10U : a; // OK
   Print(var);
  }

Ну и с двумя литералами его тоже ничего не смущает

void OnStart()
  {
   uint var = (MathRand() % 2 == 0) ? 10U : -1; // OK
   Print(var);
  }

Даже так можно

void OnStart()
  {
   uint var = (MathRand() % 2 == 0) ? (uint)10 : (int)-1; // OK
   Print(var);
  }
 

Vladislav Boyko #:
Ну и с двумя литералами его тоже ничего не смущает

void OnStart()
  {
   uint var = (MathRand() % 2 == 0) ? 10U : -1; // OK
   Print(var);
  }

C# ругается, на плюсах нет возможности проверить