Well known bug?

 

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

if (ShouldWeOpenAnOrder() && !CreateOrder())

...

Так вот, несмотря на то, что первая часть выражения может возвращать false, вторая все-равно всегда выполняется и чтобы логика правильно работала приходится преобразовывать к виду:

if (ShouldWeOpenAnOrder())

if (!CreateOrder())

...

Это известная проблема?

 
Это не проблема. Так устроено.
 
sandro78 >>:

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

if (ShouldWeOpenAnOrder() && !CreateOrder())

...

Так вот, несмотря на то, что первая часть выражения может возвращать false, вторая все-равно всегда выполняется и чтобы логика правильно работала приходится преобразовывать к виду:

if (ShouldWeOpenAnOrder())

if (!CreateOrder())

...

Это известная проблема?

Это если бы в условии было "или" - ||.

 
Integer писал(а) >>
Это не проблема. Так устроено.

а почему? - это ж очевидная неэффективность.

 
WWer писал(а) >>

Это если бы в условии было "или" - ||.

В смысле? Если говорить про "или", то второе не должно было высчитываться, если первое было бы true

 
sandro78 писал(а) >>

а почему? - это ж очевидная неэффективность.

Я с Вами согласен, неэффективно! Можно записать в качестве пожеланий к MQ5.

Никогда об этом не задумывался и самому стало интересно как этот вопрос решает мелкомягкий .

Решил проверить на VC 6.0 - действительно при наличии первого false проверка заканчивается без проверки остальных условий!

 
sandro78 >>:

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

if (ShouldWeOpenAnOrder() && !CreateOrder())

...

Так вот, несмотря на то, что первая часть выражения может возвращать false, вторая все-равно всегда выполняется и чтобы логика правильно работала приходится преобразовывать к виду:

if (ShouldWeOpenAnOrder())

if (!CreateOrder())

...

Это известная проблема?

о, я тоже сталкивался с этой проблемой!

у меня было так:

if( iBar>30 && checkWaveSeries(iBar) )

{

}


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

пришлось сделать так


if( iBar>30 )
if( checkWaveSeries(iBar) )

{

}

 

Раньше такое замечал, но думал что эти баги в программе не допустимы и поэтому не обращал особого внимания.

Неужели придется переделывать своих советников?

А если такая операция:

if (выражение1 && выражение2 && выражение3 && ........ && выражениеN)

Тогда что делать?

 
zxc >>:

Раньше такое замечал, но думал что эти баги в программе не допустимы и поэтому не обращал особого внимания.

Неужели придется переделывать своих советников?

А если такая операция:

if (выражение1 && выражение2 && выражение3 && ........ && выражениеN)

Тогда что делать?

все нормально должно быть...

 
sandro78 >>:

а почему? - это ж очевидная неэффективность.

Угу, только такая неэффективность есть даже в С++. Для оператора && при первом условии == false остальные условия не высчитываются, а вот для || поведение не определено.

Что же Вы хотите от MQL?

 
sandro78 >>:

if (ShouldWeOpenAnOrder() && !CreateOrder())

Это известная проблема?

этот вопрос проверка на тупость или я чего-то не понимаю ?

по-моему так и должно работать - чтобы получить результат условия, которое является составным условие1 && условие2,

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

независимо от того, что возвращают ваши функции (true|false) это означает, что функции корректно отработали..


а чтобы было так как вы хотите, то в ShouldWeOpenAnOrder должна возникниуть исключительная ситуация типа необработанная ошибка деление на ноль

например

bool a(){
   int a = 1, b = 0;
   a = a / b;
   return(true);
}

bool b(){
   Print("b working..");
   return(true);
}
// вторая функция не отработает
if (a() && b()) Print("yes");
Причина обращения: