09.06.2004, 14:05 | #1 |
Участник
|
Ассоциативность операции &&
Честно... лень проверять просто, На вскидку, кто может сказать порядок выполнения операции "&&":
if (this.somef1() && this.somef2()) { .... } Если this.somef1() == false будет ли выполняться this.somef2() ? Смысла в выполнении явно нет (а в некоторых моментах есть!). сорри за тривиальный вопрос щас сам проверю.... |
|
09.06.2004, 14:08 | #2 |
Участник
|
нет, не будет
|
|
09.06.2004, 14:26 | #3 |
Moderator
|
Цитата:
Смысла в выполнении явно нет (а в некоторых моментах есть!).
Идея в том, нужно разделять функции, которые выполняют какую-то работу activity и функции предназначенные для проверки каких-то условий condition. Это не закон, но рекомендация, следование которой позволит избежать многих ошибок. Например, код в somef2() не был выполнен, так как так решил оптимизатор. Например, кто-то решил дважды дернуть somef2(), чтобы выполнить какую-то проверку и при этом неосознанно выполнил код вложенный в somef2(). Насколько я помню даже в стандарте C++ не описано поведение компилятора в данном случае и каждый производитель может делать своб реализацию данного поведения. Это приведет к тому, что ваш код будет работать по разному, будучи откомпилированным разными компиляторами. Или даже откомпилированным в разных режимах - debug и release mode. |
|
09.06.2004, 15:11 | #4 |
Moderator
|
Цитата:
Насколько я помню даже в стандарте C++ не описано поведение компилятора в данном случае....
Цитата:
5.14 Logical AND operator [expr.log.and]
1 logical-and-expression: inclusive-or-expression logical-and-expression && inclusive-or-expression The && operator groups left-to-right. The operands are both implic- itly converted to type bool (_conv_). 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 (_class.temporary_) happen before the second expression is evaluated. |
|
10.06.2004, 15:15 | #5 |
Участник
|
Ну дык - в плюсах при & отработают обе стороны
а в Ахапте только одна (если она конечно сразу же 0) Мне было надо чтоб сработали обе. И стало интересно если ли подобная функция тут . |
|
10.06.2004, 15:22 | #6 |
Moderator
|
Цитата:
Ну дык - в плюсах при & отработают обе стороны
Более того, я привел пункт стандарта который четко оговаривает такое поведение. Стандарт можно почитать вот здесь http://ra.dkuug.dk/jtc1/sc22/open/n2356/ |
|
10.06.2004, 15:24 | #7 |
Moderator
|
Цитата:
Мне было надо чтоб сработали обе.
PHP код:
|
|
10.06.2004, 16:45 | #8 |
Участник
|
Чтобы сработали обе стороны, можно использовать оператор &, а не &&.
Т.е. if (this.somef1() & this.somef2()) { .... } |
|
10.06.2004, 17:05 | #9 |
Moderator
|
А откуда это ? В "Руководстве разработчика" про это ни слова.
|
|
10.06.2004, 17:18 | #10 |
Участник
|
& - это побитовое "и".
Прикольно, но действительно с ним наблюдается другое поведение, чем с логическим "и" (&&) Правда здесь возможны интересные эффекты, если сравниваются не boolean, а целые. Например 2&1 = 0 |
|
Теги |
x++ |
|
Похожие темы | ||||
Тема | Ответов | |||
Параллельные операции в маршрутах | 10 | |||
Как для ГК операции в LedgerTrans найти соответствующую операцию в VendTrans? | 20 | |||
ОС: Опреации & модели учета | 2 |
|