Вопрос спецам по программированию.

 

Иногда встречаю, особенно в старых кодах, вот такие условия

if( X == Y == Z)  или  if(X == Y == true)  или  if(X < Y < 50)

Компилятор не выдает ни ошибок, ни предупреждений. 

Это вообще нормально такой формат для mql ?

Как программа это читает?

По идее, сначала сравниваются первые два значения. Получается предположим true или false, а потом сравнивается с третьим значением?

Или сразу сравниваются три значения между собой?

 
Dmitry Sumsky:

Иногда встречаю, особенно в старых кодах, вот такие условия

if( X == Y == Z)  или  if(X == Y == true)  или  if(X < Y < 50)

Компилятор не выдает ни ошибок, ни предупреждений. 

Это вообще нормально такой формат для mql ?

Как программа это читает?

По идее, сначала сравниваются первые два значения. Получается предположим true или false, а потом сравнивается с третьим значением?

Или сразу сравниваются три значения между собой?

Навскидку:

Результат опратора "==" - булев.

Поэтому первое имеет смысл, если Z - bool (или любой целый тип, но это уже "некрасиво").

Второе - тавтология ))

Третье - скорее всего ошибка.

 

Навскидку не надо. Додумывать и сам умею.

Мне нужен тот, кто сможет прояснить ситуацию. Просто такое встречаю не первый раз. Вот и хочу выяснить как программа читает такие условия. Она же работает и чего-то считает. А вот что именно и как производятся вычисления программой - это и хочу выяснить, ведь компилятор проглатывает такое, да и программа как-то работает и чего-то рассчитывает. А вот чего именно - не понятно...

Может есть тут такие, которые сами так пишут?

Можно предположить, что это выглядит так:   if( (X==Y) ==Z) , но тогда третий вариант получится   if( (X<Y) < 50)

или  это выглядит так:    if( X<Y  &&  Y<50)

Короче, запутался...

 
Dmitry Sumsky #:

Навскидку не надо. Додумывать и сам умею.

Не нужно додумывать. Достаточно взять и проверить эти примеры:

   int X = 20;
   int Y = 30;
   
   Print(X < Y < 50);

Подставляете разные значения и получаете ответ. А заключается он в приоритетах операций и приведении типов.

 

А шо питонщики молчат? Это же их приколы.

https://docs.python.org/3/reference/expressions.html#comparisons

Also unlike C, expressions like  a < b < c have the interpretation that is conventional in mathematics.

Comparisons can be chained arbitrarily, e.g.,  x < y <= z is equivalent to  x < y and y <= z, except that  y is evaluated only once (but in both cases  z is not evaluated at all when  x < y is found to be false).

Даже проверять не хочу, поддерживает ли MQL chained comparisons (надеюсь, что нет😄)

 
Vladislav Boyko #:

А шо питонщики молчат? Это же их приколы.

Даже проверять не хочу, поддерживает ли MQL chained comparisons (надеюсь, что нет😄)

Х-м, не знал, что в Питоне по-другому. Здесь же, к сожалению или счастью, не так.

 

В МТ5

Print(1 < 2 > 3); // false
Print(1 > 2 < 3); // true
 
Vitaly Muzichenko #:

В МТ5

Логично. 0 или 1 не может быть больше трех.

 
Vitaly Muzichenko #:

В МТ5

это питоновский новояз :-) 

A op1 B op2 C :=: (A op1 B) && ( B op2 C)

при том с ограничениями на op1 и op2 (одни приоритеты и ассоциативность) ; просто краткая форма записи что B где-то между A и С

фича, йо

 
Maxim Kuznetsov #:

это питоновский новояз :-) 

A op1 B op2 C :=: (A op1 B) && ( B op2 C)

при том с ограничениями на op1 и op2 (одни приоритеты и ассоциативность) ; просто краткая форма записи что B где-то между A и С

фича, йо

Свят, свят, свят.

Ну их ... такие фичи.

 
   Print("1 < 2 > 3 ", 1 < 2 > 3);     // false
   Print("(1 < 2) > 3 ", (1 < 2) > 3); // false
   Print("true > 3 ", true > 3);       // false
   
   Print("1 > 2 < 3 ", 1 > 2 < 3);     // true
   Print("(1 > 2) < 3 ", (1 > 2) < 3); // true
   Print("false < 3 ", false < 3);     // true
   
   int X = 70;
   int Y = 60;
   Print("70 < 60 < 50 ", X < Y < 50); // true