интересный код.

 

вот встетил в индикаторе такое написание.

на первый взгляд непонятно что будет на выходе?

if(A<0.5 <50 && B<0)  return (1)
 
Найти автора и убить.
 

:)


A<0.5<50

всегда true

 

Swan писал(а) >>

всегда true


Зависит от порядка расчета. Скорей всего аналогично выражению (A < 1). Или true

 

Такая конструкция не дала ошибку компилятора.

Но вот что считает индикатор - мне непонятно...


И если так можно делать, может кто то из модераторов (разработчиков) подскажет как эту конструкцию можно использовать во благо?

 

sergeev писал(а) >>

И если так можно делать, может кто то из модераторов (разработчиков) подскажет как эту конструкцию можно использовать во благо?

Такую конструкцию можно использовать во благо только в одном случае -- переопределить оператор "<" для конвейерных операций.

Что, естественно на mql4 сделать нельзя, да и незачем :) . Поэтому это баг, однозначно.

 
sergeev >>:

Такая конструкция не дала ошибку компилятора.

Но вот что считает индикатор - мне непонятно...

ошибки нет. В Си, mql вычисляется слева направо

A<0.5

вернет true или false

(true || false)<50

.

наверное задумывалось условие - А в диапазоне от 0.5 до 50 )

 
TheXpert >>:

Такую конструкцию можно использовать во благо только в одном случае -- переопределить оператор "<" для конвейерных операций.

Что, естественно на mql4 сделать нельзя, да и незачем :) . Поэтому это баг, однозначно.

Можно использовать и в мирных целях.

например

if(A<50<0.5)

аналогично

if(!A<50)
только хз зачем. если только, чтоб никто не догадался :)
 

а чего тут страшного? читаем хэлп:

Внутреннее представление - длинное целое число размером 4 байта. Логические константы могут принимать значения 0 и 1.

т.е. результат любого логического вычисления можно считать (в прямом смыле этого слова) цифрой и ее можно даже на чтото умножить например:

int start()
{
  double A = 0.3;
  double B =3;
  Print(A<0.5);              // 1
  Print(A<0.5 <50);          // 1
  Print(B<0);                // 0
  Print(A<0.5 <50 && B<0);   // 0
  Print((A<0.5) * 3);        // 3 
  A = 13;                  
  Print((A<0.5) * 3);        // 0
}

Про приориоритеты в хелпе тоже есть "Приоритеты и порядок выполнения операций": < выполняются слева направо а && выполняется после всех <


а в "исходнике" скорее всего незамеченная очепятка. Вероятнее всего там должно было чтото вроде

if(A<0.5 && С<50 && B<0)  return (1)
Причина обращения: