Равносильна ли запись операторов if

 

Добрый день,

подскажите пожалуйста равносильны ли следующие записи.

if (A == true && func() == true) {что-то делаем}

и вот такая запись

if (A == true)

{

if(func() == true) {что-то делаем}

}

во втором случае гарантированно не проверяется второе условие, если первое ложь, а в первом?

Просто первый вариант наглядней и короче в записи, но второе условие функция и каждый раз ее выполнять нет смысла.

Спасибо!

 
YuryK1980:

Добрый день,

подскажите пожалуйста равносильны ли следующие записи.

if (A == true && func() == true) {что-то делаем}

и вот такая запись

if (A == true)

{

if(func() == true) {что-то делаем}

}

во втором случае гарантированно не проверяется второе условие, если первое ложь, а в первом?

Просто первый вариант наглядней и короче в записи, но второе условие функция и каждый раз ее выполнять нет смысла.

Спасибо!

https://www.mql5.com/ru/docs/basis/operations/bool

Раздел "Короткая оценка логических операций"

Документация по MQL5: Основы языка / Операции и выражения / Логические операции
Документация по MQL5: Основы языка / Операции и выражения / Логические операции
  • www.mql5.com
//| Script program start function                                    | "Операция &&: Результат первого выражения false, поэтому второе выражение не вычислялось" //| функция всегда возвращает false                                   | //| функция всегда возвращает true                                    |
 
YuryK1980:

Добрый день,

...

Спасибо!

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

Правильно написанные условия - залог не преднамеренной оптимизации кода

Vitaly Muzichenko, 2017.01.25 00:47

Когда пишем условия if(... && ..), то мало кто задумывается об очерёдности исполнения кода, но разработчики позаботились о том, что правильно расставленные приоритеты - залог минимизации исполнения кода по времени и ресурсам.

Возьмём к примеру простой советник на трёх условиях для входа в рынок, пусть это будет МА55, 2 белых свечи и RSI.

Дальше условие выглядит так: 

if( MA55()== 1 && RSI() > 45 && Open()== 1 )
 {
  // BUY
 }

По сути условие правильное и выполниться без проблем, но если учесть тот факт, что условие if имеет спецификацию очерёдности проверки исполнения, nо этот код лучше записать так:

if( Open()==1 && RSI() > 45 && MA55()==1 )
{
  // BUY
}

Условие if начинает проверять условия поочерёдно, и если первое выполнилось, то идёт дальше, если второе не выполнилось - выход и третье уже не проверяет, что экономит время и системные ресурсы.

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

Если будет первой стоять проверка на свечи (Open[i])  и она не выполнится, то условие на вход уже не выполнено, и делать проверку дальше не имеет смысла, просчитывать RSI и МА.

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

Простые примеры, которые можно проверить:

Alert не сработает, потому что  Flag==false, и тратить ресурсы на дальнейшую проверку функции GetFunc() не имеет смысла

bool Flag; // false

voidOnTick()
 {
//--
   if( Flag && GetFunc()== 1 ) {
     Alert("До меня очередь не дошла");
   }

//-
}

int GetFunc()
 {
  // ...
   Alert("GetAlert()");
  
//-
  return(1);
}

 

А вот этот код вызовет функцию GetFunc() и сработает Alert("GetAlert()"), но дальше не пойдёт, потому что Flag==false. В итоге условие if не выполнено, но дёрнули функцию GetFunc() затратив ресурсы, она выполнилась в полном объёме, но код внутри if не выполнен.

bool Flag; // false

voidOnTick()
 {
//--
   if( GetFunc()== 1 && Flag ) {
     Alert("До меня очередь не дошла");
   }

//-
}

int GetFunc()
 {
  // ...
   Alert("GetAlert()");
  
//-
  return(1);
}

 

Вот тут всё отработает: условия проверку прошли, и код внутри if выполнится, так-же сработаю два  Alert:

bool Flag=true;

voidOnTick()
{
//--
   if( Flag && GetFunc()== 1 ) {
     Alert("До меня очередь тоже дошла");
   }

//-
}

int GetFunc()
{
  // ...
   Alert("GetAlert()");
  
//-
  return(1);
}


Мораль такова: при написании кода расставляем правильно приоритеты, тогда код без оптимизации будет работать быстрее и легче.

Возможно когда-то напишу о циклах, профи это не нужно, а вот начинающим может пригодится.


 

Не ничего лучше, чем взять и проверить :)

//+------------------------------------------------------------------+
//|                                                            1.mq5 |
//|                              Copyright © 2019, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2019, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.00"
#property script_show_inputs
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   Print("Varian 1");
   if(1==1 && Test())
     {
      int d=0;
     }
   Print("Varian 2");
   if(1==2 && Test())
     {
      int d=0;
     }
//---
  }
//+------------------------------------------------------------------+
//| Test                                                             |
//+------------------------------------------------------------------+
bool Test()
  {
   Print(__FUNCTION__);
   return(true);
  }
//+------------------------------------------------------------------+


Результат:

2019.07.06 19:46:14.100 1 (EURUSD,H1)   Varian 1
2019.07.06 19:46:14.102 1 (EURUSD,H1)   Test
2019.07.06 19:46:14.102 1 (EURUSD,H1)   Varian 2
Файлы:
1.mq5  3 kb
 
YuryK1980:

Добрый день,

подскажите пожалуйста равносильны ли следующие записи.

if (A == true && func() == true) {что-то делаем}

и вот такая запись

if (A == true)

{

if(func() == true) {что-то делаем}

}

во втором случае гарантированно не проверяется второе условие, если первое ложь, а в первом?

Просто первый вариант наглядней и короче в записи, но второе условие функция и каждый раз ее выполнять нет смысла.

Спасибо!

Равносильны. В первом случае, если A=false, функция не будет вызываться.

 

Всем спасибо за ответы!

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