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

Вниз

Порядок условий в конструкции if   Найти похожие ветки 

 
Nucer   (2009-04-22 11:30) [0]

Можно ли писать вот так?

var
s:string;
begin
...
if (length(s)>0) and (s[1]="") then ...;
end;


Или же обязательно так:
var
s:string;
begin
...
if (length(s)>0) then if (s[1]="") then ...;
end;


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


 
Лёша   (2009-04-22 11:34) [1]

В Паскале: если первая часть из and - False, вторая не проверяется.
В SQL по разному.


 
sniknik ©   (2009-04-22 11:34) [2]

от настроек компиляции зависит. второй способ будет рабочим при любых.


 
AndreyV ©   (2009-04-22 11:35) [3]

> [0] Nucer   (22.04.09 11:30)
> Просто как-то давно читал, что условия проверяются не слева
> направо, а в случайном порядке (точнее порядок зависит от
> воли компилятора).

Это в Си слева направо с досрочным завершением.


 
Сергей М. ©   (2009-04-22 11:35) [4]


> В Паскале: если первая часть из and - False, вторая не проверяется


Это с какого же перепугу ?


 
Anatoly Podgoretsky ©   (2009-04-22 11:37) [5]

В общем случае случае второй вариант отработае во всех случаях, а первый вариант может дать AV, зависит от настроек компилятора.


 
Nucer   (2009-04-22 11:43) [6]

Благодарю за ответы.


 
Лёша   (2009-04-22 12:52) [7]

Сергей М. ©   (22.04.09 11:35) [4]

>
> > В Паскале: если первая часть из and - False, вторая не
> проверяется
>
>
> Это с какого же перепугу ?

Вывел эксперементальным путем.

 function TestTrue: boolean;
 begin
   Result := True;
   ShowMessage("Run");
 end;

 function TestFalse: boolean;
 begin
   Result := False;
 end;

begin
 if TestFalse and TestTrue then
    ShowMessage("Not Run");
end;

Не знал, что это можно заставить работать по разному в насторйках компилятора.
Кстати, где это выставляется?


 
palva ©   (2009-04-22 12:56) [8]


> Кстати, где это выставляется?

Это смотря какой компилятор.


 
Лёша   (2009-04-22 13:01) [9]

Тот, что с D2007.


 
Юрий Зотов ©   (2009-04-22 13:41) [10]

> Лёша

Посмотрите справку по опции компилятора $B, там все написано.

1. if условие1 AND условие2 then...

Вычисляется условие1. Если условие1=true, то условие2 тоже будет вычисляться. Но если условие1=false, то условие2 может вычисляться (хотя результат всего выражения уже и без того ясен), а может и не вычисляться - это зависит от действующей в данном месте кода опции $B.  

2. if условие1 THEN if условие2 then...

Вычисляется условие1. Если условие1=true, то условие2 тоже будет вычисляться. Но если условие1=false, то условие2 вычисляться не будет, независимо ни от каких опций.

3. if условие1 OR условие2 then...

Вычисляется условие1. Если условие1=false, то условие2 тоже будет вычисляться. Но если условие1=true, то условие2 может вычисляться (хотя результат всего выражения уже и без того ясен), а может и не вычисляться - это зависит от действующей в данном месте кода опции $B.

4. if условие1 XOR условие2 then...

Оба условия будут вычисляться всегда, независимо ни от каких опций.



Страницы: 1 вся ветка

Текущий архив: 2009.06.07;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.018 c
2-1240294907
Гость
2009-04-21 10:21
2009.06.07
Обработка ошибки при неверном добавлении записи в БД.


2-1240322521
FEV
2009-04-21 18:02
2009.06.07
Управление другой программой


4-1210775223
re_qas
2008-05-14 18:27
2009.06.07
ADSI в DLL


15-1238749574
Ega23
2009-04-03 13:06
2009.06.07
Тут TUser меня спрашивал про аську


2-1238778258
Kos
2009-04-03 21:04
2009.06.07
отрисовка в image