WTF x==y==z ???

 
         int x = 10;
         int y = 10;
         int z = 12000;
         int r = 0;
         
         if (x == y == z) 
         {
               r = 1;
               Print("Равны"); 
         }
         else 
         {
               r = 0;
               Print("Не равны"); 
         }
         Print("x=",x," y=",y," z=",z," r=",r);

При z = 12  они равны, при z = 12000 - о чудо, не равны.


 

Да, интересный баг. 

Причем вот так:

 if ((x == y == z) ) 

результат всегда верен. 

И если написать так: 

bool bResult = (x == y == z);

То значение  bResult всегда верное

 Но, вобще говоря, мне жутко не нравятся подобные "багогенерирующие" места вроде данного "двойного условия", присваивание в заголовке оператора if, длиннющие хитрые условия внутри заголовка оператора for... Эффективности они не добавляют, а вот понимание кода - снижают существенно.

Мне даже оператор "вопросик" не нравится. Обычный if выглядит гораздо более удобочитаемым.  

Документация по MQL5: Основы языка / Операторы / Оператор цикла for
Документация по MQL5: Основы языка / Операторы / Оператор цикла for
  • www.mql5.com
Основы языка / Операторы / Оператор цикла for - Документация по MQL5
 
Risk:
         if (x == y == z) 


Равенство трех переменных проверяется конструкцией вида if (x == y && y == z).

У вас видимо получается следующее: if ((x == y) == z). Сначала x == y возвращает результат типа bool, а потом этот bool сравнивается с z.

В любом случае, это не баг.

Документация по MQL5: Основы языка / Типы данных / Целые типы / Тип bool
Документация по MQL5: Основы языка / Типы данных / Целые типы / Тип bool
  • www.mql5.com
Основы языка / Типы данных / Целые типы / Тип bool - Документация по MQL5
 
anonymous:


Равенство трех переменных проверяется конструкцией вида if (x == y && y == z).

У вас видимо получается следующее: if ((x == y) == z). Сначала x == y возвращает результат типа bool, а потом этот bool сравнивается с z.

В любом случае, это не баг.

ну да, вроде логично.

получается, что случай с 12000 - false, я так понимаю является следствием приведения типов.

 
Бага нет. Такой конструкции в языке тоже нет.
 
TheXpert:
Бага нет. Такой конструкции в языке тоже нет.
Слышь, "эксперт", а почему она тогда компилируется ?
 
anonymous:


Равенство трех переменных проверяется конструкцией вида if (x == y && y == z).

У вас видимо получается следующее: if ((x == y) == z). Сначала x == y возвращает результат типа bool, а потом этот bool сравнивается с z.

В любом случае, это не баг.

sergeev:

ну да, вроде логично.

получается, что случай с 12000 - false, я так понимаю является следствием приведения типов.

Чуваки, вы, прежде чем писать всякую ересь, поучили бы C++ немного, чтобы не позориться на весь форум.
 
Risk:
Слышь, "эксперт", а почему она тогда компилируется ?
А что не должна?
 
Laryx:

Да, интересный баг. 

Причем вот так:

 if ((x == y == z) ) 

результат всегда верен. 


да неужели.

Не работает ни так if ((x == y == z) ),   ни  так if ((x == y) == z).

 
Risk:

Синтаксически ваш код x==y==z корректен, поэтому он компилируется. Семантически ваш код корректным не является.

 

Три идиота решили помыться, а один модератор отмыться.

Могу оказать помощь всем ( и себе в том числе).

 

Может грубить не будем и удалим оскорбляющие ( в том числе и оппонентов посты)

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