Форум: "Основная";
Текущий архив: 2003.09.04;
Скачать: [xml.tar.bz2];
Внизif и порядок выполнения условий, разделенных or Найти похожие ветки
← →
AkaSaint (2003-08-21 11:59) [0]Есть оператор if, например такой:
if Condition1 or Condition2 then ...
будет ли в Дельфи проверяться Condition2, если Condition1 уже True?
← →
Skier (2003-08-21 12:01) [1]всё зависит от опции компилятора {$B+/-}
← →
Johnmen (2003-08-21 12:10) [2]По умолчанию {$B-}, т.е. не будет.
Подробности {$B-} + F1
← →
Anatoly Podgoretsky (2003-08-21 12:23) [3]Порядок решает компилятор, но как правило слева направо
← →
ghg (2003-08-21 12:59) [4]2AkaSaint © (21.08.03 11:59)
а что от этого что-то может измениться?
по-моему пофиг будет он дальше проверять или нет, разве что время жалко на проверку условия, но это вряд ли заметное время
← →
Johnmen (2003-08-21 13:03) [5]>ghg © (21.08.03 12:59) [4]
>а что от этого что-то может измениться?
Еще как может измениться !!! Вся логика работы может измениться !
← →
Anatoly Podgoretsky (2003-08-21 13:12) [6]Johnmen © (21.08.03 13:03) [5]
И не только логика, но и AV легко получить
← →
pasha_golub (2003-08-21 13:20) [7]2ghg
А если во втором условии отрабатывает функция, которая изменяет глобальные переменные? Если {$B-}, то функция не отработает, иначе отработает. Вот тебе и изменения
← →
Skier (2003-08-21 13:24) [8]if Assigned(SomeObject) and SomeObject.SomeMethod then...
при {$B+} и SomeObject = nil получим AV. Тоже разница...:)
← →
KSergey (2003-08-21 14:08) [9]Skier © (21.08.03 13:24)
if Assigned(SomeObject) and SomeObject.SomeMethod then...
при {$B+} и SomeObject = nil получим AV. Тоже разница...:)
Это просто как иллюстрация или как?
Вообще-то думаю всегда тут надо писать 2 разных условия. В Си эта часть более формализована. Там хоть точно с лева на право вычисления идут...
← →
Skier (2003-08-21 14:11) [10]>KSergey © (21.08.03 14:08) [9]
> Это просто как иллюстрация или как?
Да. К утверждению [4]
> Вообще-то думаю всегда тут надо писать 2 разных условия
Не обязательно.
← →
AkaSaint (2003-08-21 16:37) [11]Всем спасибо :-)
← →
KSergey (2003-08-21 16:40) [12]Skier © (21.08.03 14:11)
> Вообще-то думаю всегда тут надо писать 2 разных условия
Не обязательно.
Это почему, интересно? Разве где-то в документации к дельфи сказано, сто выполняются условия строго в права на лево? Или я пропустил? Вот и А.Подгорецкий говорит, что лишь "как правило". Так что это, по-моему, опасный стиль написания...
← →
Skier (2003-08-21 16:42) [13]>KSergey © (21.08.03 16:40) [12]
Ты предлагаешь писать всегда так ?
if Assigned(SomeObject) then
if SomeObject.SomeMethod then...
← →
KSergey (2003-08-21 16:43) [14]Ой, ну и наколбасил, блин.. Повторюсь, извините.
Skier © (21.08.03 14:11)
> Вообще-то думаю всегда тут надо писать 2 разных условия
Не обязательно.
Это почему, интересно? Разве где-то в документации к дельфи сказано, что выполняются (проверяются) условия строго с лева на право? Или я пропустил? Вот и А.Подгорецкий говорит, что лишь "как правило". Так что это, по-моему, опасный стиль написания...
PS: да, если что - уточнение: под "двумя отдельными" имеется в виду конструкция вида
if Obj <> nil then
if Obj.Prop =... then
← →
KSergey (2003-08-21 16:45) [15]Skier © (21.08.03 16:42)
>KSergey © (21.08.03 16:40) [12]
Ты предлагаешь писать всегда так ?
if Assigned(SomeObject) then
if SomeObject.SomeMethod then...
Да, я настаиваю на том, что этот метод даст более гарантированный результат, если следовать документации.
(Это в том случае, если в документации точно нет гарантий, что выражения вычисляются с лева на право; я таких гарантий не видел)
← →
Skier (2003-08-21 16:49) [16]
> Так что это, по-моему, опасный стиль написания...
А по-моему нет.
Ставим в опция ком-ра усечённое вычисление
логических выражений и преспокойно пишем
if Assigned(SomeObject) and SomeObject.SomeMethod then...
А если нам где-то понадобилось "полное" вычисление, то директиву
$B можно включить "по месту".
Усечённое вычисление быстрее же работает.
И если это было бы "опасно" ты думаешь стал бы Borland использовать усечённое вычисление ?
← →
KSergey (2003-08-21 16:54) [17]Skier © (21.08.03 16:49)
Стоп, вопросы:
1. Где сказано в документации о порядке вычисления выражений?
2. Где именно Borland использует усеченное вычисление? Не понял. Примерчик, пожалуйста.
В самом по себе усеченном вычислении никаких проблем нет.
Можно смело писать
var
a,b,c: Boolean
....
if a or b or c then...
и нет проблем - усеченное вычисление лишь поднимет скорость.
В обсуждаемом же случае (KSergey (21.08.03 16:43)) порядок выполнения - очень важен! А как его гарантировать? Только двумя раздельными операциями.
← →
Sandman25 (2003-08-21 16:56) [18]Complete versus short-circuit Boolean evaluation
The compiler supports two modes of evaluation for the and and or operators: complete evaluation and short-circuit (partial) evaluation. Complete evaluation means that each conjunct or disjunct is evaluated, even when the result of the entire expression is already determined. Short-circuit evaluation means strict left-to-right evaluation that stops as soon as the result of the entire expression is determined. For example, if the expression A and B is evaluated under short-circuit mode when A is False, the compiler won’t evaluate B; it knows that the entire expression is False as soon as it evaluates A.
Object Pascal Language Guide, D6.
← →
KSergey (2003-08-21 16:58) [19]Sandman25 (21.08.03 16:56)
Премного благодарен.
Подгорецкому больше не верю ;) (шутка)
← →
Skier (2003-08-21 16:59) [20]>KSergey © (21.08.03 16:54) [17]
1)
> В обсуждаемом же случае (KSergey (21.08.03 16:43)) порядок
> выполнения - очень важен!
Абсолютно не важен ! Он один и тот же - слева на право, т.к. речь здесь идёт о конкретном компиляторе.
> Где именно Borland использует усеченное вычисление?
Он использует его по умолчанию
Пример я уже приводил...
← →
KSergey (2003-08-21 17:09) [21]Skier © (21.08.03 16:59)
>KSergey © (21.08.03 16:54) [17]
1)
> В обсуждаемом же случае (KSergey (21.08.03 16:43)) порядок
> выполнения - очень важен!
Абсолютно не важен !
Нифига себе не важен! Т.е. можно сначала выполить SomeObject.SomeMethod,
а потом проверить Assigned(SomeObject)? Ну вы ляпнули ;) Думаю, не осознанно. ;)
Он один и тот же - слева на право, т.к. речь здесь идёт о конкретном компиляторе.
Дык вот до поста Sandman25 (21.08.03 16:56) это не было известно (мне, во всяком случае).
Пример я уже приводил...
Какой? Я не вижу (я имел в виду конкретный пример из хелпа или, скажем, VCL, хотя VCL - надежнее (в хелпах и не такое еще напишут ;) )
Впрочем, после упомянутого поста Sandman25 спор теряет смысл. Я был в каком-то смысле не прав (т.е. писать все в одном условии можно ;)
Но, нонятно, порядок должен быть такой, какой в ваших модельных примерах.
← →
Skier (2003-08-21 17:15) [22]
> Нифига себе не важен! Т.е. можно сначала выполить SomeObject.SomeMethod,
> а потом проверить Assigned(SomeObject)? Ну вы ляпнули ;)
> Думаю, не осознанно. ;)
А ! Ты вот о чем ! :) Тогда конечно важен !
Я думал что ты говоршь о том как не программист пишет выражения,
а как их обрабатывает компилятор. Отсюда и моё возмущение. :)
> т.е. писать все в одном условии можно ;)
Можно и нужно этим пользоваться
← →
Anatoly Podgoretsky (2003-08-21 20:38) [23]Skier © (21.08.03 17:15) [22]
В принципе можно, ранее так и было, было специально оговорено насчет порядка - не закладывайтесь, но в связи с ООП стали делать слева направо и это тоже оговорено в документации.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.09.04;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.01 c