![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
begin...end [D6]
Игорь1 © (2004-08-15 12:10:00)Подскажите, пожалуйста, имеет ли смысл писать begin вот в таких ситуациях и если да, то почему.
спасибо.
if x <> 0 then
begin // ?
for i := 0 to 10 do
begin
...
...
end;
end;
или
if x <> 0 then
begin // ?
case x of
1:
...
2:
...
end;
end;
или можно проще:
if x <> 0 then
for i := 1 to 10 do
begin
...
...
end;
JohnnyJ (2004-08-27 13:23:00) [1]Я пишу всегда так:
if (condition) then
begin
<одна и более строка кода>
end
else
begin
<одна и более строка кода>
end;
Просто наблюдал долгую и кровопролитную битву человека с приложением, когда в ветке else был один оператор, он добавил еще один, а про begin..end забыл. Все компилится, а работает неправильно :)
Отлаживаться он толком не научился, сколько его паяльником и кипятильником не били. Прошел бы в отладке - заметил бы сразу. А так он пнул - данные кривые, полез что-нибудь подровнял в проге, снова пнул.
После этого случая взял себе за правило оформлять код именно так. Т. е. если требуется в конструкции оператор, то я ставлю составнойоператор.
DiamondShark (2004-08-27 13:07:00) [2]
> Ты представляешь как работает предсказание в Пентиумах?
По звёздам.
ASoft (2004-08-27 07:44:00) [3]Если в теле процедуры много "If" и "Else", то лучше использовать, по возможности, "Case".
Но, порой, трудно отследить всё от begin...If...Else...до последнего end, то лишними begin..end не будут. А будет на подобие упорядочивания. Так думаю.
GuAV (2004-08-27 01:12:00) [4]
> Ты представляешь как работает предсказание в Пентиумах?
Что за Предсказание?
Григорьев Антон (2004-08-16 10:24:00) [5]Я предпочитаю делать так: вместо
if ... then
begin
...
...
...
end
else
X:=0;
писать
if ... then
begin
...
...
...
end
else
begin
X:=0
end;
Чтобы у двух веток if было единообразие. В остальных случаях лишних begin/end не ставлю.
Anatoly Podgoretsky (2004-08-16 09:55:00) [6]Тоже почти всегда, а если есть else то всегда
panov (2004-08-16 09:52:00) [7]В 99% случаях пишу begin..end, так как для меня важна читабельность кода, а не количество символов в исходном коде.
Anatoly Podgoretsky (2004-08-16 07:34:00) [8]GuAV © (15.08.04 21:25) [23]
Ты представляешь как работает предсказание в Пентиумах?
Германн (2004-08-16 03:21:00) [9]И все таки возвращаясь к сабжу:
Игорь1 (15.08.04 12:10)
Подскажите, пожалуйста, имеет ли смысл писать begin вот в таких ситуациях и если да, то почему.
спасибо.
if x <> 0 then
begin // ?
for i := 0 to 10 do
begin
В таких случаях я почти всегда пишу и begin и end.
Дело в том, что и then и do, в общем случае предполагают наличие за ними некоего "тела", т.е. набора строк исходного текста, которые все либо должны быть выполнены, либо не выполнены, либо выполнены частично.
Поэтому и тело then и тело for богут быть весьма длинными, или не быть таковыми. А для удобочитаемости я всегда (иногда по необходимости, а иногда для удобства) использую begin и end.
А компиллятор и оптимизатор Дельфи, при этом, не создают мне лишних проблем.
GuAV (2004-08-15 21:25:00) [10]
> Оптимизатор у Дельфи достойного уровня.
Мда. Разработчики средства разработки оптимизируют компилятор под приложения, чтобы генерировать инструкции хорошо в любой ситуации.
Разработчики приложения оптимизируют код приложения под компилятор, чтобы генерировать инструкции хорошо в конкретной ситуации. Сами явно задать инструкции не могут.
Причём производительность оценивают через DebugWindows->CPU. То что вроде как бы для отладки, а не для оптимизации.
И всё ради транспортабельности в нет. А ведь такая отимизация может быть не портируема даже от компилера к компилеру. Например в Дельфи лучше не использовать переменную цикла повторно, чтобы он мог её в "регистры запузырить". В каком то паскале все переменные в стеке, т.е. лучше использовать повторно. При этом хотим портировать "в другой мир". Клоунада...
Vetek_2 (2004-08-15 21:01:00) [11]у меня раз были крупные проблемы с тем, к какому IF'у относится else ....
(прога жутко глючила, не сразу догадался где ошибка была..)
- в итоге я сейчас пишу в таких случаях обязательно begin end :))
- имхо очень повышает понятность логики работы :)))
Anatoly Podgoretsky (2004-08-15 20:51:00) [12]Затем, что ассемблер надо использовать только в исключительных случаях, когда на паскеле не получается (работа с флагами) или когда выходит действительно серьезное повышение производительности. Код на ассемблере будет не транспортабельный в .net
Поэтому я использую асм код в очень редких случаях. Оптимизатор у Дельфи достойного уровня.
GuAV (2004-08-15 20:39:00) [13]Anatoly Podgoretsky © (15.08.04 20:29) [19]
И зачем Вы тогда пишете
> begin...end
, писали бы asm...end ;-)
Anatoly Podgoretsky (2004-08-15 20:29:00) [14]Когда скорость важна, то требуется просмотреть код условных операторов в окне CPU, что бы выполнялось наиболее вероятное и часто условие, иначе будет пенальти по тактам. Если видно, что переход неверный, то сменить условие на инверсное.
GuAV (2004-08-15 20:25:00) [15]GuAV © (15.08.04 20:16) [16]
Знак вопрса пропустил...
Юрий Зотов (2004-08-15 20:18:00) [16]Добавление.
Этот пример я бы написал так в том случае, если скорость исполнения данного уска некритична, или если мне заранее ничего не известно о возможных значениях A, B и Z.
В противном же случае есть правило - писать цепочку проверок так, чтобы результат был получен как можно быстрее. И когда скорость критична, то она важнее, чем лишние begin-end.
GuAV (2004-08-15 20:16:00) [17]А в таких случаях пишут:
if Condition1 then
if Condition2 then
Statement1
else
else Satement2;
или
if Condition1 then
begin
if Condition2 then
Statement1;
end
else Satement2;
Юрий Зотов (2004-08-15 18:44:00) [18]Никогда не пишу:
1. Лишние begin-end.
2. Лишние скобки.
3. Лишние точки с запятой.
4. И вообще ничего лишнего.
Можно сказать, что все это - дело вкуса. Но правило "в программе не должно быть ничего лишнего" заставляет постоянно думать - то есть, дисциплинирует и приучает к аккуратности при кодировании. В итоге снижается количество ошибок - вот зачем это нужно.
В частности, приведенный выше пример
if a > z then
begin
if a = b then...;
end
else ...
я бы написал так:
if a <= z then
...
else
if a = b then ...
Михаил Макушев (2004-08-15 18:03:00) [19]>Правильно
>if a>z and a=b then
Такая ситуация не пойдет если в проверке условий используются скажем критичные на разрушение программы функции (проверка созданий объектов и пр.) тогда только такой вариант c двойным IF
YurikGL (2004-08-15 17:52:00) [20]Anatoly Podgoretsky © (15.08.04 17:44) [12]
> неправильно:
> if a>z then
> if a=b then...;
> else ...
>
> правильно:
> if a>z then
> begin
> if a=b then...;
> end
> else ...
Оба варианта правильны в зависимости от того, какая логика выполнения требуется от программы. Единственное, что не правильно в первом варианте это - ; но компилятор просто ругнется на это.