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

Вниз

проблемы с 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;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.02 c
2-1176805357
Fynjy1984
2007-04-17 14:22
2007.05.06
Помогите правильно составить запрос


1-1173257292
tytus
2007-03-07 11:48
2007.05.06
Как перевести %USERPROFILE% - в C: Documents and Settings ...


2-1175842041
DelphiLexx
2007-04-06 10:47
2007.05.06
Как за Node: TTreeNode привязыть число


2-1176906265
Oleg_teacher
2007-04-18 18:24
2007.05.06
Image в Memo


11-1156441224
NORDmen
2006-08-24 21:40
2007.05.06
нужно сделать zip архив из kol программы