Странности оператора If()

 

Заметил вот такую особенность в mql4. Все бы ничего, да вот в компиляторах под С++ этот вопрос давно уже решили. Вроде и несущественная недоработка, но как минимум на скорость работы советника влияет. А теперь по сути.

Допустим есть конструкция if( func1() && func2() && func3() ) { ... }. Все вункции возвращают тип bool. Проблемма в том, что нет смысла вызывать функции 2 и 3, если первая возвратила false! То же касаеться и логического ИЛИ. if( func1() || func2() || func3() ) { ... } Если первая функция вернула true, то зачем вызывать оставшиеся две?

Недавно столкнулся с этим при написании советника. Он ну никак нехотел работать, хоть все с виду было логично и красиво. Полдня потратил на поиск бага, пока не дошло в чем проблемма. Теперь использую if() для И вот так:

if( func1() )
if( func2() )
if( func3() )
{ ... }

Для ИЛИ точно незнаю как сделать, но думаю вот так:

bool check()
{
if( func1() ) return(true);
if( func2() ) return(true);
if( func3() ) return(true);
return(false);
}

Если все три функции небольшие и полностью независимы друг от друга, то и в старых конструкциях if() небудет проблем. Но если одна функция влияет на переменную, которая используеться остальными двумя (как в моем случае), или же функции довольно громоздки, это может повлиять не только на скорость работы советника, но и на его работоспособность вообще!

 

https://docs.mql4.com/ru/basis/syntax

В MQL4 нет укороченной оценки при вычислении сложного логического выражения

 

Позволю себе заметить некую странность: во всех языках && и || - это операторы именно short-circuit...

http://en.wikipedia.org/wiki/Short-circuit_evaluation

Видимо, если эффекта short-circuit нет, то обозначения || и && лучше не использовать.

 

Нужно меньше скобочки экономить.. тогда и лишних вопросов не будет возникать..

if( func1() ){
if( func2() ) {
if( func3() ){

....

}

}

}

 
forte928 >>:

Нужно меньше скобочки экономить.. тогда и лишних вопросов не будет возникать..

if( func1() ){
if( func2() ) {
if( func3() ){

....

}

}

}

если в теле if() только один оператор, то смысла ставить фигурные скобки нет. или я неправ?

 
stringo >>:

https://docs.mql4.com/ru/basis/syntax

В MQL4 нет укороченной оценки при вычислении сложного логического выражения

спасибо! незнал. походу я изобрел велосипед! :)