Что не правильно в условиях?

 

Странно, но раньше условия записанные в таком виде прекрасно работали, сейчас же принтуется какая то билеберда:

#property copyright "Copyright 2019, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property script_show_inputs

input int X = 30;
input int Y = 30;

int flag = 0;
int x = 0;
int y = 0;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
   while(!IsStopped())
   {   

      if(flag == 0 && x < X)
      {
         x++;
         y++;
      }
      else flag = 1;
      if(flag == 1 && y > 0)y--; else flag = 2;
      if(flag == 2 && x > 0)x--; else flag = 0;
      
      Print("x= ", x, "   y= ", y, "   flag= ", flag);
      
      Sleep(300);
   }   
}
//+------------------------------------------------------------------+

те же условия, но записанные в другом виде работают правильно:

#property copyright "Copyright 2019, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property script_show_inputs

input int X = 30;
input int Y = 30;

int flag = 0;
int x = 0;
int y = 0;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
   while(!IsStopped())
   {
      if(flag == 0)
      {
         if(x < X)
         {
            x++;
            y++;
         }
         else flag = 1;
      }
      if(flag == 1)
      {
         if(y > 0)y--; else flag = 2;
      }
      if(flag == 2)
      {
         if(x > 0)x--; else flag = 0;
      }
      
      Print("x= ", x, "   y= ", y, "   flag= ", flag);
      
      Sleep(300);
   }   
}
//+------------------------------------------------------------------+

Кто нибудь может это прокомментировать? Такое ощущение, что с последними обновлениями поменяли приоритеты выполнения.

МТ4 билд 1170, билд компилятора 1966

 

Очевидных ошибок не вижу. Из личного опыта дебага могу подсказать "мистический" способ, связанных с унарными операторами ++ и --. Попробуй их заменить на +=1 и -=1. А вдруг случится чудо? )

 
AdjusterAdviser:

Очевидных ошибок не вижу. Из личного опыта дебага могу подсказать "мистический" способ, связанных с унарными операторами ++ и --. Попробуй их заменить на +=1 и -=1. А вдруг случится чудо? )

Да нет, пробовал уже по разному и так +=1 и так x=x+1 и так x++... на результат не влияет. В принципе чудо уже случилось, я же написал что 2-ой вариант работает правильно. Просто неясно почему это не работает

if(flag == 1 && y > 0)y--; else flag = 2;

а это работает

if(flag == 1)
{
   if(y > 0)y--; else flag = 2;
}

Ведь по сути это одно и тоже.

 
Sergey Kolemanov:

Странно, но раньше условия записанные в таком виде прекрасно работали, сейчас же принтуется какая то билеберда:

те же условия, но записанные в другом виде работают правильно:

Кто нибудь может это прокомментировать? Такое ощущение, что с последними обновлениями поменяли приоритеты выполнения.

МТ4 билд 1170, билд компилятора 1966

Нет ошибок. Все верно, т. к. код:

if(flag == 0 && x < X)
{
   x++;
   y++;
}
else flag = 1;

не эквивалентен коду:

if(flag == 0)
{
    if(x < X)
    {
       x++;
       y++;
    }
    else flag = 1;
}

Соответственно, поведение у них будет разное.

 
Sergey Kolemanov:

Ведь по сути это одно и тоже.

одно и то же это вот так:

if(flag==0 && x<X){ x++; y++; } else flag=1;
if(flag==0)
  {
   if(x<X) { x++; y++; } else flag=1;
  }
else flag=1;
т.е. в Вашем примере, любое не выполнение условия (flag==0)  или (x<X) должно привести к выполнению flag=1;
 
Ihor Herasko:

Нет ошибок. Все верно, т. к. код:

не эквивалентен коду:

Соответственно, поведение у них будет разное.

Не поленился, проверил, поведение одинаковое.

#property copyright "Copyright 2019, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property script_show_inputs

input int X = 15;

int flag = 0;
int x = 0;
int y = 0;
int flag1 = 0;
int x1 = 0;
int y1 = 0;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
   while(!IsStopped())
   {   

      if(flag == 0 && x < X)
      {
         x++;
         y++;
      }
      else flag = 1;

      if(flag1 == 0)
      {
         if(x1 < X)
         {
            x1++;
            y1++;
         }
         else flag1 = 1;
      }  

      if(flag == 0)Print("x= ", x, "   y= ", y, "   flag= ", flag);
      if(flag1 == 0)Print("x1= ", x1, "   y1= ", y1, "   flag1= ", flag1);
      
      Sleep(300);
   }   
}
//+------------------------------------------------------------------+
 
Sergey Kolemanov:

Не поленился, проверил, поведение одинаковое.

Ну если уж проверять, то проверять не частный случай, а по всем фронтам:

input int X = 15;

int flag = 2;
int x = 0;
int y = 0;
int flag1 = 2;
int x1 = 0;
int y1 = 0;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
   if(flag == 0 && x < X)
   {
      x++;
      y++;
   }
   else flag = 1;

   if(flag1 == 0)
   {
      if(x1 < X)
      {
         x1++;
         y1++;
      }
      else flag1 = 1;
   }  

   Print("x= ", x, "   y= ", y, "   flag= ", flag);
   Print("x1= ", x1, "   y1= ", y1, "   flag1= ", flag1);
}

Получим:

x1= 0   y1= 0   flag1= 2
x= 0   y= 0   flag= 1
 
Ihor Herasko:

Ну если уж проверять, то проверять не частный случай, а по всем фронтам:

Получим:

Да Игорь, Ваша правда, поведение разное...