Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
14-10925
mOOx_
2003-08-16 15:14
2003.09.04
Список запущенных задач на удаленной машине


8-10840
zumo
2003-05-08 06:41
2003.09.04
DSPAck


14-10965
Soft
2003-08-15 17:33
2003.09.04
Российский процессор Эльбрус может стать конкурентом Itanium


14-10914
Without Any ...
2003-08-17 21:56
2003.09.04
О том, что не приветствуется на этом фомуме


3-10578
Алексей Петухов
2003-08-14 09:01
2003.09.04
TDBGrid





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский