![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Порядок условий в конструкции 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]от настроек компиляции зависит. второй способ будет рабочим при любых.