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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.05.2021, 14:01   #1
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 639
По умолчанию Диапазоны

Код:
If c in ['0'..'9'] then {что-то там}
с : char

Вопрос: при таком коде переменная "с" будет сверяться только с крайними значениями диапазона и по ним проверят попадает ли она в диапазон, или же будет сверять по очереди с каждым элементом диапазона?

Какой код оптимальнее?
Код:
If (c<'0') or (c>'9') then begin
{Что-то там 2}
end else begin
{Что-то там 1}
end
ИЛИ
Код:
If c in ['0'..'9'] then begin
{Что-то там 1}
end else begin
{Что-то там 2}
end
Kronos913 вне форума Ответить с цитированием
Старый 19.05.2021, 16:25   #2
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,561
По умолчанию

Так какие проблемы? Прописал тот и другой вариант и посмотрел сгенерированный ассемблерный текст. (View -> Debug Windows -> CPU)
У меня на компе Дельфи нет, потому глянуть не могу.
digitalis вне форума Ответить с цитированием
Старый 19.05.2021, 21:27   #3
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,318
По умолчанию

Код:
var
  c: Char;
begin
  c := '1';
  if (c >= '0') and (c <= '9') then
  begin
    ShowMessage('1');
  end;
  if c in ['0'..'9'] then
  begin
    ShowMessage('2');
  end;
end;
Код:
Unit1.pas.31: if (c >= '0') and (c <= '9') then
0045268B 80FB30           cmp bl,$30
0045268E 720F             jb +$0f
00452690 80FB39           cmp bl,$39
00452693 770A             jnbe +$0a
Unit1.pas.33: ShowMessage('1');
00452695 B8BC264500       mov eax,$004526bc
0045269A E8E58DFDFF       call ShowMessage
Unit1.pas.35: if c in ['0'..'9'] then
0045269F 80C3D0           add bl,$d0
004526A2 80EB0A           sub bl,$0a
004526A5 730A             jnb +$0a
Unit1.pas.37: ShowMessage('2');
004526A7 B8C8264500       mov eax,$004526c8
004526AC E8D38DFDFF       call ShowMessage
Как видно из асм-кода, сверяется не с каждым элементом диапазона. Код с диапазоном удобнее, если требуется сравнивать со сложным диапазоном. По скорости работы не подскажу, не нашел сколько тактов требуется на ту или иную инструкцию. С другой стороны, действительно ли этот код будет узким местом, чтобы его максимально оптимизировать. Выиграете пару тактов, а в другом месте какая-нибудь функция просто так дергается 1000 раз.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Диапазоны Loire Microsoft Office Excel 3 06.06.2019 09:29
диапазоны СУММЕСЛИ() Khalid Паскаль, Turbo Pascal, PascalABC.NET 0 12.03.2015 10:38
Диапазоны в VBA Outed Microsoft Office Excel 4 17.02.2015 08:38
Разбить на диапазоны! Seregakz Общие вопросы Delphi 3 21.09.2014 16:49
Динамические диапазоны LaryMusa Microsoft Office Excel 8 05.07.2010 21:20