Главная страница
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.013 c
15-1238790611
Юрий
2009-04-04 00:30
2009.06.07
С днем рождения ! 4 апреля 2009 суббота


15-1238953192
ЭРИКА
2009-04-05 21:39
2009.06.07
С ДНЕМ РОЖДЕНИЯ!


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


15-1238724570
Anatoly Podgoretsky
2009-04-03 06:09
2009.06.07
Сервера Google DataCenter


15-1237999517
Городской Шаман
2009-03-25 19:45
2009.06.07
Offline репликация данных своими руками.