Форум: "Начинающим";
Текущий архив: 2007.05.06;
Скачать: [xml.tar.bz2];
Внизпроблемы с IF Найти похожие ветки
← →
Dush © (2007-04-14 11:08) [0]Доброго времени суток!
возникла проблема: в условииif (data1=data2) and (Time1<=Time2) then DoIt;
если верно первое условие то второе не проверяется. Как от этого избавится?
Я знаю что можно сделать так:if (data1=data2) then
if (Time1<=Time2) then DoIt;
а по другому?
← →
Johnmen © (2007-04-14 11:12) [1]Выставить опцию компилятора {$B+}
← →
Dush © (2007-04-14 11:13) [2]спасибо
← →
Johnmen © (2007-04-14 11:13) [3]
> сли верно первое условие то второе не проверяется.
...то второе проверяется.
← →
Anatoly Podgoretsky © (2007-04-14 13:18) [4]> Dush (14.04.2007 11:08:00) [0]
> то второе не проверяется
С чего бы? Новое слово в программирование?
← →
{RASkov} (2007-04-14 13:26) [5]При соотвествующих опциях компилятора, второе условие может не проверяться если первое ложно... что в данном случае - наоборот.
← →
homm © (2007-04-14 13:36) [6]> второе условие может не проверяться если первое ложно
Не ложное. а если результат первого условия делает бессмысленым проверку второго. Например если это AND то ясно что если первое условие ложн, то выражение ложно, вне зависимости от второго. Если OR и первое условие истоино, то выражение истино и дальнейшая проверка так-же не имеет смысла.
← →
{RASkov} (2007-04-14 13:40) [7]> [6] homm © (14.04.07 13:36)
Согласен... :) но в любом случае
> второе условие не проверяеться - если первое ложно
:)
← →
homm © (2007-04-14 13:46) [8]> но в любом случае
Не в любом. В случае если выставлены определенные опции (возможно даже по умолчанию) и это для случая AND для случая OR все наоборот.
← →
{RASkov} (2007-04-14 13:52) [9]> для случая OR все наоборот.
ну да... чет я с ором ступил :)
← →
Johnmen © (2007-04-14 19:15) [10]
> Anatoly Podgoretsky © (14.04.07 13:18) [4]
> чего бы? Новое слово в программирование?
Старое слово. В вычислении булевских выражений.
← →
Anatoly Podgoretsky © (2007-04-14 19:26) [11]> Johnmen (14.04.2007 19:15:10) [10]
Я что то не знаю такого, если первое выражение истинно, то для AND не надо вычислять второе.
← →
Johnmen © (2007-04-14 21:34) [12]
> Anatoly Podgoretsky © (14.04.07 19:26) [11]
> > Johnmen (14.04.2007 19:15:10) [10]Я что то не знаю такого,
> если первое выражение истинно, то для AND не надо вычислять
> второе.
Кто-то кого-то не понимает...
Я говорю о выражении A and B (как и указано в [0]).
Если первое выражение A истинно, то вычисляем B.
← →
Anatoly Podgoretsky © (2007-04-14 22:31) [13]Это ты говоришь и я тут с тобой солидарен, но автор говорит, что
Если первое выражение A истинно, то НЕ вычисляем B.
← →
homm © (2007-04-14 22:31) [14]> [12] Johnmen © (14.04.07 21:34)
Так, не спорь, [4] было написано автору вопроса, дабы указать на его ошибку, то что ты посто ранее сам на нее указал не удаляет ошибку из поста автора.
← →
Johnmen © (2007-04-14 22:54) [15]Да-да, я уже запутался, где чьи посты...:) Пойду спать...
← →
Anatoly Podgoretsky © (2007-04-14 23:01) [16]> Johnmen (14.04.2007 22:54:15) [15]
Лучше водки выпей
← →
Johnmen © (2007-04-14 23:10) [17]
> Anatoly Podgoretsky © (14.04.07 23:01) [16]
> Лучше водки выпей
Я завязал...
← →
Германн © (2007-04-15 01:23) [18]Вот ну никогда не возникала у меня необходимость использовать
Complete boolean evaluation
! По-моему это что-то из разряда "соломку подстелить" или "первое приближение алгоритмизации к батонокидательству".
← →
homm © (2007-04-15 01:28) [19]> По-моему это что-то из разряда "соломку подстелить" или
> "первое приближение алгоритмизации к батонокидательству".
Какое право ты имееш принежать тех у кого такая необходимость возникала? Если после долгих раздумий не можеш понять зачем нужна такая штука, это совсем не значит что она для батонокидателей. Ты не думал что это именно у тебя ума не хватило найти ей применение? А применение ей есть.
← →
Германн © (2007-04-15 01:45) [20]
> Какое право ты имееш(ь) принежать тех(,) у кого такая необходимость
> возникала? Если после долгих раздумий не можеш(ь) понять зачем
> нужна такая штука, это совсем не значит что она для батонокидателей.
> Ты не думал что это именно у тебя ума не хватило найти
> ей применение? А применение ей есть.
>
А я собс-но и не стараюсь обязательно найти применение всем значениям всех опций компиллятора. У меня нет времени на глупости.
> А применение ей есть.
Пример в студию, пожалуйста!
P.S.
Выделения в цитате - мои. Было бы очень смешно читать сей пост, если бы не было столь грустно :(
← →
Sha © (2007-04-16 00:37) [21]> homm © (15.04.07 01:28) [19]
Есть-то оно есть ))
Но если ты не мазохист, забудь про это сразу -
и спокойный сон по ночам гарантирован.
← →
Asail (2007-04-16 09:22) [22]
> Пример в студию, пожалуйста!
. . .
if IsCheckSomething1 and IsCheckSomthing2 then
DoSomething1;
. . .
function IsCheckSomething1: Boolean;
begin
DoSomething2;
end;
function IsCheckSomething2: Boolean;
begin
DoSomething3;
end;
Если "Complete boolean evaluation" не выставленна, а IsCheckSomething1 возвращает true, то DoSomething3 не будет выполнена никогда (что может быть весьма не желательно).
← →
Johnmen © (2007-04-16 09:26) [23]
> Если "Complete boolean evaluation" не выставленна, а IsCheckSomething1
> возвращает true, то DoSomething3 не будет выполнена никогда
> (что может быть весьма не желательно).
Если это "весьма не желательно", то м.б. стОит просто вызвать DoSomething3 и не гиморойничать с if ?
← →
Asail (2007-04-16 10:18) [24]Не факт...
На пример, если надо выполнить DoSomething1 только в том случае если DoSomething2 и DoSomething3 обе выполнились успешно (вернули True), то приведенный в [22] пример ИМХО наиболее лаконичен и читабелен.
← →
{RASkov} (2007-04-16 11:31) [25]> [24] Asail (16.04.07 10:18)
> Если "Complete boolean evaluation" не выставленна, а IsCheckSomething1
> возвращает true, то DoSomething3 не будет выполнена никогда
Да вжизь не поверю, что:
if True and False then DoSomething1;
- при таком раскладе выполниться DoSomething1;
С OR вот такое может случиться...
← →
{RASkov} (2007-04-16 11:39) [26]> [24] Asail (16.04.07 10:18)
> Complete boolean evaluation
при отключенной опции вычисляются ВСЕ выражения до тех пор, пока вычисление дальше не перестанет быть значимым...
if A and B or C then...
здесь С может быть опущен(не вычеслен)....
← →
Asail (2007-04-16 11:45) [27]
> {RASkov} (16.04.07 11:31) [25]
Ой туплю... Конечно-же OR...
Ну, да пример остается в силе (с небольшой поправкой: выполнить DoSomething1 только в том случае если или DoSomething2 или DoSomething3 или обе выполнились успешно.)
← →
{RASkov} (2007-04-16 12:04) [28]> Ой туплю...
Да ладно...:) я с [5] и в [9] точ так-же ступил :)
← →
Германн © (2007-04-16 16:03) [29]
> Asail (16.04.07 09:22) [22]
>
>
> > Пример в студию, пожалуйста!
>
> . . .
> if IsCheckSomething1 and IsCheckSomthing2 then
> DoSomething1;
>
Это не пример. Это теоретическая абстракция. :(
← →
Asail (2007-04-16 23:29) [30]
function A(Qry: TQuery): Boolean;
begin
try
Qry.ExecSQL;
Result := False;
except
Result := True;
end;
end;
procedure Test;
begin
if A(Query1) or A(Query2) or A(Query3) then
ShowMessage("Ошибка в запросах!");
end;
Вот конкретный пример, демонстрирующий проблему.
1) {$B-} При падении в Query1 - Query2 и Query3 даже не попытаются выполниться
2) {$B+} При падении в Query1 - Query2 и Query3 замечательно отработают.
Так-что учитывать сей нюанс весьма желательно :-).
← →
{RASkov} (2007-04-16 23:44) [31]> [30] Asail (16.04.07 23:29)
Это пример того, как НЕ надо делать :) И это уже ошибка программиста... имхо.
← →
{RASkov} (2007-04-16 23:47) [32]Не видел ни одного примера где была необходимость включать Complete boolean evaluation.... Т.е. чёб без нее никак.
← →
Asail (2007-04-17 00:25) [33]
> {RASkov} (16.04.07 23:47) [32]
> Не видел ни одного примера где была необходимость включать
> Complete boolean evaluation.... Т.е. чёб без нее никак.
И нет таких (чтоб необходимость)... Я просто показал конкретный пример, как можно нарваться на неприятности в совершенно тривиальном коде, по незнанию некоторых нюансов компиляции. И если бы не этот нюанс с директивой Complete boolean evaluation, то этот код был-бы вполне легитиный ...имхо тоже.
← →
homm © (2007-04-17 00:37) [34]> Это пример того, как НЕ надо делать :)
А ежели так? :){$B+}
function A(Qry: TQuery): Boolean;
begin
try
Qry.ExecSQL;
Result := False;
except
Result := True;
end;
end;
procedure Test;
begin
if A(Query1) or A(Query2) or A(Query3) then
ShowMessage("Ошибка в запросах!");
end;
← →
Германн © (2007-04-17 01:06) [35]
> Asail (16.04.07 23:29) [30]
>
> Вот конкретный пример, демонстрирующий проблему.
> 1) {$B-} При падении в Query1 - Query2 и Query3 даже не
> попытаются выполниться
Факт падения в Query1 очевидно должен рассматриваться как сбой программы, после которого результат дальнейшей работы непредсказуем. Зачем же тогда обязательно выполнять Query2 и Query3?
P.S.
Имхо. Единственно кто бы мог привести реальный пример необходимости Complete boolean evaluation, это "железячник", вроде меня. А у меня Вот ну никогда не возникала у меня необходимость использовать Complete boolean evaluation!
Имею мнение, хрен оспоришь :)
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.05.06;
Скачать: [xml.tar.bz2];
Память: 0.53 MB
Время: 0.037 c