Well known bug? - страница 2

 
TheXpert писал(а) >>

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

Странно, для || его тоже легко определить. Первое же условие true должно исключать необходимость в дальнейшем оценивании полного условия.

 
Mathemat >>:

Странно, для || его тоже легко определить. Первое же условие true должно исключать необходимость в дальнейшем оценивании полного условия.

Говорю как есть. Определить легко, реализовать сложно.

Кроме того, от выражения

if (cond1 || cond2 || cond3 || ... || condn)
{
   //...
}

легко перейти к выражению

if (!cond1 && !cond2 && !cond3 && ... && !condn)
{
   //... 
}
else
{
   //...
}
поэтому достаточно реализации только для &&
 

Поправлю чуток.

(cond1 || cond2 || cond3 || ... || condn) == !(!cond1 && !cond2 && !cond3 && ... && !condn)
 
Mathemat >>:

Поправлю чуток.

Ну да, или так, я вместо отрицания блок else добавил.

 

в справке так и написано, как оно работает ..

Логическая операция И (&&) значений x и y. Значением выражения является ИСТИНА(1), если значения x и y истинны (не нуль). В противном случае - ЛОЖЬ(0). Логические выражения вычисляются ПОЛНОСТЬЮ, т.е., к ним не применяется схема так называемой "короткой оценки".

а ПОЛНОСТЬЮ - это то, что вас не удовлетворяет..


гм.. по-моему ни первая конструкция TheExpert'a -

вместо хотя бы одной истины из множества значений предлагается только одно - когда все значения ложь (или наоборот для else)


ни вторая Mathemat'a -

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


не являются эквивалентными..



 
zxc >>:

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

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

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

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

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

на данный момент просто учитывать, что все выражения будут вычислены. Но, строго говоря, проблема фрустрирует. Я уже как-то за свою практику программирования привык к определенным общепринятым концепциям и когда наткнулся на проблему не сразу даже понял в чем дело.

 
TheXpert >>:

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

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

минутку, про С++ не надо, выдержки из стандарта:



5.14 Logical AND operator [expr.log.and]
logical-and-expression:
inclusive-or-expression
logical-and-expression && inclusive-or-expression
1 The && operator groups left-to-right. The operands are both implicitly converted to type bool (clause 4). The result
is true if both operands are true and false otherwise. Unlike &, && guarantees left-to-right evaluation: the second
operand is not evaluated if the first operand is false.
2 The result is a bool. All side effects of the first expression except for destruction of temporaries (12.2) happen before

the second expression is evaluated.



5.15 Logical OR operator [expr.log.or]
logical-or-expression:
logical-and-expression
logical-or-expression || logical-and-expression
1 The || operator groups left-to-right. The operands are both implicitly converted to bool (clause 4). It returns true if
either of its operands is true, and false otherwise. Unlike |, || guarantees left-to-right evaluation; moreover, the second
operand is not evaluated if the first operand evaluates to true.
2 The result is a bool. All side effects of the first expression except for destruction of temporaries (12.2) happen before
the second expression is evaluated



Да и вообще, честно говоря, не встречал пока языка, где б по другому было

 
keekkenen >>:

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

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

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

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


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

например

ну видимо просто действительно не понимаете. Для того чтобы понять, что выражение "expr1 && expr2" будет false, если первая его часть уже false вовсе необязательно высчитывать вторую. Про это здесь и идет речь.

 
sandro78 >>:

минутку, про С++ не надо, выдержки из стандарта:

Сорри, значит зевнул.

Действительно зевнул, порядок определен для операторов || && и,

Приношу свои извинения и беру свои слова обратно :) .

 

м-да, не вник БЕРУ свои слова обратно - конструкции верные

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