Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > порядок исполнения кода в условиях


Автор: СЭНСЭЙ 6.12.2014, 21:19
Добрый день.

Знаю что в ПХП, например, операнды в условии обрабатываются с лева на право и их обработка прекращается если одно или несколько операндов удовлетворяет условие.

Например:

Код

if (func1() || func2()) func3();


аналог на делфи:
Код

if func1() or func2() then func3();


результат функции func2 не будет вычисляться и функция проигнорируется если результат выполнения func1()=true.

А как обстоят дела в делфи?
Как называется такая документация и где можно про это прочитать?
П.С. в хелпе по делфи 7 я этой информации не нашел.

Автор: Poseidon 6.12.2014, 21:30
Цитата(СЭНСЭЙ @ 6.12.2014,  21:19)
результат функции func2 не будет вычисляться и функция проигнорируется если результат выполнения func1()=true.

А как обстоят дела в делфи?
Как называется такая документация и где можно про это прочитать?

Точно так же. Об этом не будет написано в справке к Delphi, это основы Pascal. Можешь экспериментальным путем это проверить. 

Автор: Illusion Dolphin 6.12.2014, 21:33
В делфи можно менять поведение http://stackoverflow.com/questions/18598466/break-condition-to-or-and-and-operators-in-an-if-statement http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/devcommon/compdirsbooleanshortcircuitevaluation_xml.html

Автор: СЭНСЭЙ 9.12.2014, 22:35
But notice that this isn't only an optimisation, since this feature allows you to write code like


Код

if (length(myarr) > 0) and (myarr[0] = MY_VAL) then


which will work even if myarr[0] doesn't exist. This is rather common, actually.

Но ведь в делфи и так можно обращаться к несуществующему элементу массива?
Или только если массив динамический?

Да - проверил. Только если массив динамический.
Если индексы массива заданы явно то нельзя.

И еще проверил:
Код

{$B-}
{$BOOLEVAL OFF}

a:array [1..2] of integer;
begin
if(length(a)>2) and (a[3]=1)
then a[3]:=1;


выдает ошибку на условии 
так что похоже директива не помогает

Автор: bems 9.12.2014, 22:53
на статических массивах компилятор проверяет индексы статически, где может.
а обращаться к несуществующим индексам нельзя, но для включения проверки индексов в рантайм есть отдельная директива компилятора {$R+} 
если она выключена то код проверяющий индекс не генерируется, но при обращении к несуществующим индексам возможны рандомные проблемы 

Автор: phomm 12.12.2014, 22:52
По последнему посту автора ответ:
директива тут ни при чём, она работает отдельно от проверки индексов, и компилятор спокойно съест код:
Код

{$BOOLEVAL ON}
a:array [1..2] of integer;
b: integer = 3;
begin
if(length(a)>2) and (a[b]=1)
then a[b]:=1;

но засчёт буливала будет чтение по некорректному индексу.
Просто компилятор умеет понимать, что индекс стамассива некорректный когда его задают константой (явной или просто числом), а вот при указании через переменную - не поймёт.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)