Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.07.2011, 19:52   #1
celovec
Форумчанин
 
Регистрация: 15.06.2007
Сообщений: 182
По умолчанию if or else if

Код:
  if (user = 20) then begin
    ***
  end else if (user = 100) or (user = 500) or (user = 1000) then begin
    ***
  end;

Код:
  if (user = 20) then begin
    ***
  end;
  if (user = 100) or (user = 500) or (user = 1000) then begin
    ***
  end;
Расскажите пожалуйста в чем разница между этими двумя примерами. Каким из них лучше пользоваться и почему?
celovec вне форума Ответить с цитированием
Старый 04.07.2011, 20:41   #2
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> в чем разница

в том, что если переменная user имеет значение 20, то второй пример будет проводить лишние проверки, а первый не будет.

> Каким из них лучше пользоваться

никаким. Лучше в таком случае пользоваться case:

Код:
case (user) of

  20: begin
    ***
  end;

  100, 500, 1000: begin
    ***
  end;

end;
и наглядней, и оптимизировать проще компилятору.

Ну а если без case, то лучше первым.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 04.07.2011, 20:56   #3
Epiffan
 
Аватар для Epiffan
 
Регистрация: 04.07.2011
Сообщений: 2
По умолчанию

поскажите пожалуйста, а внутри case можно вкладывать ещё case, примерно вот так
Код:
case (user) of

  20: begin
   
   case (user) of

     20: begin
       ***
     end;

     100, 500, 1000: begin
       ***
     end;

   end;

  end;

  100, 500, 1000: begin
    ***
  end;

end;
Epiffan вне форума Ответить с цитированием
Старый 04.07.2011, 20:59   #4
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> внутри case можно вкладывать ещё case

можно, конечно.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 04.07.2011, 21:01   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Можно, но в таком виде не имеет смысла - первый 100, 500, 1000: begin никогда не отработает
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 04.07.2011, 21:05   #6
celovec
Форумчанин
 
Регистрация: 15.06.2007
Сообщений: 182
По умолчанию

Насколько я понял в case нельзя работать с текстом?

Пример:
Код:
case (edit1.text) of
  'open': begin
***
celovec вне форума Ответить с цитированием
Старый 04.07.2011, 21:07   #7
Epiffan
 
Аватар для Epiffan
 
Регистрация: 04.07.2011
Сообщений: 2
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Можно, но в таком виде не имеет смысла - первый 100, 500, 1000: begin никогда не отработает
да я просто привел пример, я не собирался по несколько раз одинаковые параметры проверять, спасибо за ответы
Epiffan вне форума Ответить с цитированием
Старый 04.07.2011, 21:07   #8
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> в case нельзя работать с текстом

да, так не получится. Можно только case по символам отдельным.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 04.07.2011, 21:12   #9
celovec
Форумчанин
 
Регистрация: 15.06.2007
Сообщений: 182
По умолчанию

С первой задачей разобрался, спасибо.
А как быть с таким примером:
Код:
if (edit1.text = 'hi') then begin
    ***
  end else 
if (edit1.text = 'орi') and (edit2.Text='kj') then begin
    ***
  end else 
  if (edit1.text = 'hi') or (edit1.text = 'open') then begin
    ***
end;
Возможно его можно как-то по другому оптимизировать?

Последний раз редактировалось celovec; 04.07.2011 в 21:29.
celovec вне форума Ответить с цитированием
Старый 04.07.2011, 21:23   #10
zumm
БохЪ
Форумчанин
 
Аватар для zumm
 
Регистрация: 30.09.2009
Сообщений: 724
По умолчанию

Цитата:
Возможно его можно как-то по другому оптимизировать?
Для начала неплохо было бы соблюдать православное табулирование. Так же из выше приведенного кода проверку

Код:
if (edit1.text = 'hi') or (edit1.text = 'open') then
можно смело заменять на

Код:
if edit1.text = 'open' then
А вообще, если проверок достаточно много, то использовать удобнее все тот же case, только сравнивать не строки, а сумму кодов их символов. шанс на совпадение сумм в обычных условиях стремится к нулю.
В планах порабощение вселенной...
zumm вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц