Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Порядок условий в конструкции if


Nucer ©   (2009-04-22 11:30:00) 

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

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 13:41:00) [1]

> Лёша

Посмотрите справку по опции компилятора $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...

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


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

Тот, что с D2007.


palva   (2009-04-22 12:56:00) [3]


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

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


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

Сергей М. ©   (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;

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


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

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


Anatoly Podgoretsky   (2009-04-22 11:37:00) [6]

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


AndreyV   (2009-04-22 11:35:00) [7]

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

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


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


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


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


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

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


sniknik   (2009-04-22 11:34:00) [10]

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо