Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.09.04;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.021 c
1-10758
Eagle Owl
2003-08-24 00:22
2003.09.04
Обработка исключения...


7-10994
Igorexa
2003-06-11 16:30
2003.09.04
создание редакторов, плееров и т.д.


14-10890
Ru
2003-08-18 14:58
2003.09.04
Рекогносцировка местности.


3-10563
Karnegi
2003-08-15 10:55
2003.09.04
Помогите с фильтрацией по дате


1-10732
DVP1
2003-08-20 11:35
2003.09.04
Как проверить, нажата ли Enter в TStringGride в ячейке...